mirror of https://github.com/minio/minio.git
				
				
				
			Enable build on solaris (#4115)
This commit is contained in:
		
							parent
							
								
									83abad0b37
								
							
						
					
					
						commit
						2b96d9f706
					
				| 
						 | 
					@ -25,6 +25,11 @@ _init() {
 | 
				
			||||||
    OSX_VERSION="10.8"
 | 
					    OSX_VERSION="10.8"
 | 
				
			||||||
    KNAME=$(uname -s)
 | 
					    KNAME=$(uname -s)
 | 
				
			||||||
    ARCH=$(uname -m)
 | 
					    ARCH=$(uname -m)
 | 
				
			||||||
 | 
					    case "${KNAME}" in
 | 
				
			||||||
 | 
					        SunOS )
 | 
				
			||||||
 | 
					            ARCH=$(isainfo -k)
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					    esac
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## FIXME:
 | 
					## FIXME:
 | 
				
			||||||
| 
						 | 
					@ -97,7 +102,7 @@ assert_is_supported_arch() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
assert_is_supported_os() {
 | 
					assert_is_supported_os() {
 | 
				
			||||||
    case "${KNAME}" in
 | 
					    case "${KNAME}" in
 | 
				
			||||||
        Linux | FreeBSD | OpenBSD | NetBSD | DragonFly )
 | 
					        Linux | FreeBSD | OpenBSD | NetBSD | DragonFly | SunOS )
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        Darwin )
 | 
					        Darwin )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
// +build linux darwin openbsd netbsd
 | 
					// +build linux darwin openbsd netbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Minio Cloud Storage, (C) 2017 Minio, Inc.
 | 
					 * Minio Cloud Storage, (C) 2017 Minio, Inc.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,4 @@
 | 
				
			||||||
// +build linux darwin netbsd
 | 
					// +build linux darwin netbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Minio Cloud Storage, (C) 2017 Minio, Inc.
 | 
					 * Minio Cloud Storage, (C) 2017 Minio, Inc.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Minio Cloud Storage, (C) 2017 Minio, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					 * you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					 * You may obtain a copy of the License at
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					 * See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					 * limitations under the License.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "errors"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetStats - stub implementation for Solaris, this will not give us
 | 
				
			||||||
 | 
					// complete functionality but will enable fs setups on Solaris.
 | 
				
			||||||
 | 
					func GetStats() (stats Stats, err error) {
 | 
				
			||||||
 | 
						return Stats{}, errors.New("Not implemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					Copyright (c) 2009 The Go Authors. All rights reserved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions are
 | 
				
			||||||
 | 
					met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   * Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					   * Redistributions in binary form must reproduce the above
 | 
				
			||||||
 | 
					copyright notice, this list of conditions and the following disclaimer
 | 
				
			||||||
 | 
					in the documentation and/or other materials provided with the
 | 
				
			||||||
 | 
					distribution.
 | 
				
			||||||
 | 
					   * Neither the name of Google Inc. nor the names of its
 | 
				
			||||||
 | 
					contributors may be used to endorse or promote products derived from
 | 
				
			||||||
 | 
					this software without specific prior written permission.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
 | 
					A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
				
			||||||
 | 
					OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
				
			||||||
 | 
					SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
				
			||||||
 | 
					DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
				
			||||||
 | 
					THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
				
			||||||
 | 
					(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
				
			||||||
 | 
					OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					Additional IP Rights Grant (Patents)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"This implementation" means the copyrightable works distributed by
 | 
				
			||||||
 | 
					Google as part of the Go project.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Google hereby grants to You a perpetual, worldwide, non-exclusive,
 | 
				
			||||||
 | 
					no-charge, royalty-free, irrevocable (except as stated in this section)
 | 
				
			||||||
 | 
					patent license to make, have made, use, offer to sell, sell, import,
 | 
				
			||||||
 | 
					transfer and otherwise run, modify and propagate the contents of this
 | 
				
			||||||
 | 
					implementation of Go, where such license applies only to those patent
 | 
				
			||||||
 | 
					claims, both currently owned or controlled by Google and acquired in
 | 
				
			||||||
 | 
					the future, licensable by Google that are necessarily infringed by this
 | 
				
			||||||
 | 
					implementation of Go.  This grant does not include claims that would be
 | 
				
			||||||
 | 
					infringed only as a consequence of further modification of this
 | 
				
			||||||
 | 
					implementation.  If you or your agent or exclusive licensee institute or
 | 
				
			||||||
 | 
					order or agree to the institution of patent litigation against any
 | 
				
			||||||
 | 
					entity (including a cross-claim or counterclaim in a lawsuit) alleging
 | 
				
			||||||
 | 
					that this implementation of Go or any code incorporated within this
 | 
				
			||||||
 | 
					implementation of Go constitutes direct or contributory patent
 | 
				
			||||||
 | 
					infringement, or inducement of patent infringement, then any patent
 | 
				
			||||||
 | 
					rights granted to you under this License for this implementation of Go
 | 
				
			||||||
 | 
					shall terminate as of the date such litigation is filed.
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,173 @@
 | 
				
			||||||
 | 
					# Building `sys/unix`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The sys/unix package provides access to the raw system call interface of the
 | 
				
			||||||
 | 
					underlying operating system. See: https://godoc.org/golang.org/x/sys/unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Porting Go to a new architecture/OS combination or adding syscalls, types, or
 | 
				
			||||||
 | 
					constants to an existing architecture/OS pair requires some manual effort;
 | 
				
			||||||
 | 
					however, there are tools that automate much of the process.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Build Systems
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					There are currently two ways we generate the necessary files. We are currently
 | 
				
			||||||
 | 
					migrating the build system to use containers so the builds are reproducible.
 | 
				
			||||||
 | 
					This is being done on an OS-by-OS basis. Please update this documentation as
 | 
				
			||||||
 | 
					components of the build system change.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Old Build System (currently for `GOOS != "Linux" || GOARCH == "sparc64"`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The old build system generates the Go files based on the C header files
 | 
				
			||||||
 | 
					present on your system. This means that files
 | 
				
			||||||
 | 
					for a given GOOS/GOARCH pair must be generated on a system with that OS and
 | 
				
			||||||
 | 
					architecture. This also means that the generated code can differ from system
 | 
				
			||||||
 | 
					to system, based on differences in the header files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To avoid this, if you are using the old build system, only generate the Go
 | 
				
			||||||
 | 
					files on an installation with unmodified header files. It is also important to
 | 
				
			||||||
 | 
					keep track of which version of the OS the files were generated from (ex.
 | 
				
			||||||
 | 
					Darwin 14 vs Darwin 15). This makes it easier to track the progress of changes
 | 
				
			||||||
 | 
					and have each OS upgrade correspond to a single change.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To build the files for your current OS and architecture, make sure GOOS and
 | 
				
			||||||
 | 
					GOARCH are set correctly and run `mkall.sh`. This will generate the files for
 | 
				
			||||||
 | 
					your specific system. Running `mkall.sh -n` shows the commands that will be run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Requirements: bash, perl, go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### New Build System (currently for `GOOS == "Linux" && GOARCH != "sparc64"`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The new build system uses a Docker container to generate the go files directly
 | 
				
			||||||
 | 
					from source checkouts of the kernel and various system libraries. This means
 | 
				
			||||||
 | 
					that on any platform that supports Docker, all the files using the new build
 | 
				
			||||||
 | 
					system can be generated at once, and generated files will not change based on
 | 
				
			||||||
 | 
					what the person running the scripts has installed on their computer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The OS specific files for the new build system are located in the `${GOOS}`
 | 
				
			||||||
 | 
					directory, and the build is coordinated by the `${GOOS}/mkall.go` program. When
 | 
				
			||||||
 | 
					the kernel or system library updates, modify the Dockerfile at
 | 
				
			||||||
 | 
					`${GOOS}/Dockerfile` to checkout the new release of the source.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To build all the files under the new build system, you must be on an amd64/Linux
 | 
				
			||||||
 | 
					system and have your GOOS and GOARCH set accordingly. Running `mkall.sh` will
 | 
				
			||||||
 | 
					then generate all of the files for all of the GOOS/GOARCH pairs in the new build
 | 
				
			||||||
 | 
					system. Running `mkall.sh -n` shows the commands that will be run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Requirements: bash, perl, go, docker
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Component files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This section describes the various files used in the code generation process.
 | 
				
			||||||
 | 
					It also contains instructions on how to modify these files to add a new
 | 
				
			||||||
 | 
					architecture/OS or to add additional syscalls, types, or constants. Note that
 | 
				
			||||||
 | 
					if you are using the new build system, the scripts cannot be called normally.
 | 
				
			||||||
 | 
					They must be called from within the docker container.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### asm files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The hand-written assembly file at `asm_${GOOS}_${GOARCH}.s` implements system
 | 
				
			||||||
 | 
					call dispatch. There are three entry points:
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					  func Syscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
 | 
				
			||||||
 | 
					  func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
 | 
				
			||||||
 | 
					  func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					The first and second are the standard ones; they differ only in how many
 | 
				
			||||||
 | 
					arguments can be passed to the kernel. The third is for low-level use by the
 | 
				
			||||||
 | 
					ForkExec wrapper. Unlike the first two, it does not call into the scheduler to
 | 
				
			||||||
 | 
					let it know that a system call is running.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When porting Go to an new architecture/OS, this file must be implemented for
 | 
				
			||||||
 | 
					each GOOS/GOARCH pair.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### mksysnum
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Mksysnum is a script located at `${GOOS}/mksysnum.pl` (or `mksysnum_${GOOS}.pl`
 | 
				
			||||||
 | 
					for the old system). This script takes in a list of header files containing the
 | 
				
			||||||
 | 
					syscall number declarations and parses them to produce the corresponding list of
 | 
				
			||||||
 | 
					Go numeric constants. See `zsysnum_${GOOS}_${GOARCH}.go` for the generated
 | 
				
			||||||
 | 
					constants.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Adding new syscall numbers is mostly done by running the build on a sufficiently
 | 
				
			||||||
 | 
					new installation of the target OS (or updating the source checkouts for the
 | 
				
			||||||
 | 
					new build system). However, depending on the OS, you make need to update the
 | 
				
			||||||
 | 
					parsing in mksysnum.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### mksyscall.pl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `syscall.go`, `syscall_${GOOS}.go`, `syscall_${GOOS}_${GOARCH}.go` are
 | 
				
			||||||
 | 
					hand-written Go files which implement system calls (for unix, the specific OS,
 | 
				
			||||||
 | 
					or the specific OS/Architecture pair respectively) that need special handling
 | 
				
			||||||
 | 
					and list `//sys` comments giving prototypes for ones that can be generated.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The mksyscall.pl script takes the `//sys` and `//sysnb` comments and converts
 | 
				
			||||||
 | 
					them into syscalls. This requires the name of the prototype in the comment to
 | 
				
			||||||
 | 
					match a syscall number in the `zsysnum_${GOOS}_${GOARCH}.go` file. The function
 | 
				
			||||||
 | 
					prototype can be exported (capitalized) or not.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Adding a new syscall often just requires adding a new `//sys` function prototype
 | 
				
			||||||
 | 
					with the desired arguments and a capitalized name so it is exported. However, if
 | 
				
			||||||
 | 
					you want the interface to the syscall to be different, often one will make an
 | 
				
			||||||
 | 
					unexported `//sys` prototype, an then write a custom wrapper in
 | 
				
			||||||
 | 
					`syscall_${GOOS}.go`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### types files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For each OS, there is a hand-written Go file at `${GOOS}/types.go` (or
 | 
				
			||||||
 | 
					`types_${GOOS}.go` on the old system). This file includes standard C headers and
 | 
				
			||||||
 | 
					creates Go type aliases to the corresponding C types. The file is then fed
 | 
				
			||||||
 | 
					through godef to get the Go compatible definitions. Finally, the generated code
 | 
				
			||||||
 | 
					is fed though mkpost.go to format the code correctly and remove any hidden or
 | 
				
			||||||
 | 
					private identifiers. This cleaned-up code is written to
 | 
				
			||||||
 | 
					`ztypes_${GOOS}_${GOARCH}.go`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The hardest part about preparing this file is figuring out which headers to
 | 
				
			||||||
 | 
					include and which symbols need to be `#define`d to get the actual data
 | 
				
			||||||
 | 
					structures that pass through to the kernel system calls. Some C libraries
 | 
				
			||||||
 | 
					preset alternate versions for binary compatibility and translate them on the
 | 
				
			||||||
 | 
					way in and out of system calls, but there is almost always a `#define` that can
 | 
				
			||||||
 | 
					get the real ones.
 | 
				
			||||||
 | 
					See `types_darwin.go` and `linux/types.go` for examples.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To add a new type, add in the necessary include statement at the top of the
 | 
				
			||||||
 | 
					file (if it is not already there) and add in a type alias line. Note that if
 | 
				
			||||||
 | 
					your type is significantly different on different architectures, you may need
 | 
				
			||||||
 | 
					some `#if/#elif` macros in your include statements.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### mkerrors.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This script is used to generate the system's various constants. This doesn't
 | 
				
			||||||
 | 
					just include the error numbers and error strings, but also the signal numbers
 | 
				
			||||||
 | 
					an a wide variety of miscellaneous constants. The constants come from the list
 | 
				
			||||||
 | 
					of include files in the `includes_${uname}` variable. A regex then picks out
 | 
				
			||||||
 | 
					the desired `#define` statements, and generates the corresponding Go constants.
 | 
				
			||||||
 | 
					The error numbers and strings are generated from `#include <errno.h>`, and the
 | 
				
			||||||
 | 
					signal numbers and strings are generated from `#include <signal.h>`. All of
 | 
				
			||||||
 | 
					these constants are written to `zerrors_${GOOS}_${GOARCH}.go` via a C program,
 | 
				
			||||||
 | 
					`_errors.c`, which prints out all the constants.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To add a constant, add the header that includes it to the appropriate variable.
 | 
				
			||||||
 | 
					Then, edit the regex (if necessary) to match the desired constant. Avoid making
 | 
				
			||||||
 | 
					the regex too broad to avoid matching unintended constants.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Generated files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `zerror_${GOOS}_${GOARCH}.go`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A file containing all of the system's generated error numbers, error strings,
 | 
				
			||||||
 | 
					signal numbers, and constants. Generated by `mkerrors.sh` (see above).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `zsyscall_${GOOS}_${GOARCH}.go`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A file containing all the generated syscalls for a specific GOOS and GOARCH.
 | 
				
			||||||
 | 
					Generated by `mksyscall.pl` (see above).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `zsysnum_${GOOS}_${GOARCH}.go`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A list of numeric constants for all the syscall number of the specific GOOS
 | 
				
			||||||
 | 
					and GOARCH. Generated by mksysnum (see above).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### `ztypes_${GOOS}_${GOARCH}.go`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					A file containing Go types for passing into (or returning from) syscalls.
 | 
				
			||||||
 | 
					Generated by godefs and the types file (see above).
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for 386, Darwin
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, Darwin
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					// +build arm,darwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for ARM, Darwin
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						B	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					// +build arm64,darwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, Darwin
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
				
			||||||
 | 
						B	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, DragonFly
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-64
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-88
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-112
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-64
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-88
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for 386, FreeBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, FreeBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2012 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for ARM, FreeBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						B	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for 386, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·socketcall(SB),NOSPLIT,$0-36
 | 
				
			||||||
 | 
						JMP	syscall·socketcall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·rawsocketcall(SB),NOSPLIT,$0-36
 | 
				
			||||||
 | 
						JMP	syscall·rawsocketcall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·seek(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·seek(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for AMD64, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·gettimeofday(SB),NOSPLIT,$0-16
 | 
				
			||||||
 | 
						JMP	syscall·gettimeofday(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for arm, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·seek(SB),NOSPLIT,$0-32
 | 
				
			||||||
 | 
						B	syscall·seek(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build arm64
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build mips64 mips64le
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for mips64, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,31 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build mips mipsle
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for mips, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						JMP syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					// Copyright 2014 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build ppc64 ppc64le
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for ppc64, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						BR	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						BR	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						BR	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						BR	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,28 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build s390x
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for s390x, Linux
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						BR	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						BR	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						BR	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						BR	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for 386, NetBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, NetBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2013 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for ARM, NetBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						B	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						B	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						B	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for 386, OpenBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-52
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,29 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System call support for AMD64, OpenBSD
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Just jump to package syscall's implementation for all these functions.
 | 
				
			||||||
 | 
					// The runtime may know about them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·Syscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·Syscall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·Syscall9(SB),NOSPLIT,$0-104
 | 
				
			||||||
 | 
						JMP	syscall·Syscall9(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall(SB),NOSPLIT,$0-56
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
 | 
				
			||||||
 | 
						JMP	syscall·RawSyscall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,17 @@
 | 
				
			||||||
 | 
					// Copyright 2014 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "textflag.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// System calls for amd64, Solaris are implemented in runtime/syscall_solaris.go
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·sysvicall6(SB),NOSPLIT,$0-64
 | 
				
			||||||
 | 
						JMP	syscall·sysvicall6(SB)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEXT ·rawSysvicall6(SB),NOSPLIT,$0-64
 | 
				
			||||||
 | 
						JMP	syscall·rawSysvicall6(SB)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Bluetooth sockets and messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Bluetooth Protocols
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						BTPROTO_L2CAP  = 0
 | 
				
			||||||
 | 
						BTPROTO_HCI    = 1
 | 
				
			||||||
 | 
						BTPROTO_SCO    = 2
 | 
				
			||||||
 | 
						BTPROTO_RFCOMM = 3
 | 
				
			||||||
 | 
						BTPROTO_BNEP   = 4
 | 
				
			||||||
 | 
						BTPROTO_CMTP   = 5
 | 
				
			||||||
 | 
						BTPROTO_HIDP   = 6
 | 
				
			||||||
 | 
						BTPROTO_AVDTP  = 7
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						HCI_CHANNEL_RAW     = 0
 | 
				
			||||||
 | 
						HCI_CHANNEL_USER    = 1
 | 
				
			||||||
 | 
						HCI_CHANNEL_MONITOR = 2
 | 
				
			||||||
 | 
						HCI_CHANNEL_CONTROL = 3
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Socketoption Level
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SOL_BLUETOOTH = 0x112
 | 
				
			||||||
 | 
						SOL_HCI       = 0x0
 | 
				
			||||||
 | 
						SOL_L2CAP     = 0x6
 | 
				
			||||||
 | 
						SOL_RFCOMM    = 0x12
 | 
				
			||||||
 | 
						SOL_SCO       = 0x11
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						R_OK = 0x4
 | 
				
			||||||
 | 
						W_OK = 0x2
 | 
				
			||||||
 | 
						X_OK = 0x1
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,102 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// readInt returns the size-bytes unsigned integer in native byte order at offset off.
 | 
				
			||||||
 | 
					func readInt(b []byte, off, size uintptr) (u uint64, ok bool) {
 | 
				
			||||||
 | 
						if len(b) < int(off+size) {
 | 
				
			||||||
 | 
							return 0, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if isBigEndian {
 | 
				
			||||||
 | 
							return readIntBE(b[off:], size), true
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return readIntLE(b[off:], size), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readIntBE(b []byte, size uintptr) uint64 {
 | 
				
			||||||
 | 
						switch size {
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							return uint64(b[0])
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[1]) | uint64(b[0])<<8
 | 
				
			||||||
 | 
						case 4:
 | 
				
			||||||
 | 
							_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[3]) | uint64(b[2])<<8 | uint64(b[1])<<16 | uint64(b[0])<<24
 | 
				
			||||||
 | 
						case 8:
 | 
				
			||||||
 | 
							_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[7]) | uint64(b[6])<<8 | uint64(b[5])<<16 | uint64(b[4])<<24 |
 | 
				
			||||||
 | 
								uint64(b[3])<<32 | uint64(b[2])<<40 | uint64(b[1])<<48 | uint64(b[0])<<56
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic("syscall: readInt with unsupported size")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readIntLE(b []byte, size uintptr) uint64 {
 | 
				
			||||||
 | 
						switch size {
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							return uint64(b[0])
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							_ = b[1] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[0]) | uint64(b[1])<<8
 | 
				
			||||||
 | 
						case 4:
 | 
				
			||||||
 | 
							_ = b[3] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24
 | 
				
			||||||
 | 
						case 8:
 | 
				
			||||||
 | 
							_ = b[7] // bounds check hint to compiler; see golang.org/issue/14808
 | 
				
			||||||
 | 
							return uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 |
 | 
				
			||||||
 | 
								uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							panic("syscall: readInt with unsupported size")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseDirent parses up to max directory entries in buf,
 | 
				
			||||||
 | 
					// appending the names to names. It returns the number of
 | 
				
			||||||
 | 
					// 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)
 | 
				
			||||||
 | 
						count = 0
 | 
				
			||||||
 | 
						for max != 0 && len(buf) > 0 {
 | 
				
			||||||
 | 
							reclen, ok := direntReclen(buf)
 | 
				
			||||||
 | 
							if !ok || reclen > uint64(len(buf)) {
 | 
				
			||||||
 | 
								return origlen, count, names
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							rec := buf[:reclen]
 | 
				
			||||||
 | 
							buf = buf[reclen:]
 | 
				
			||||||
 | 
							ino, ok := direntIno(rec)
 | 
				
			||||||
 | 
							if !ok {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if ino == 0 { // File absent in directory.
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))
 | 
				
			||||||
 | 
							namlen, ok := direntNamlen(rec)
 | 
				
			||||||
 | 
							if !ok || namoff+namlen > uint64(len(rec)) {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							name := rec[namoff : namoff+namlen]
 | 
				
			||||||
 | 
							for i, c := range name {
 | 
				
			||||||
 | 
								if c == 0 {
 | 
				
			||||||
 | 
									name = name[:i]
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Check for useless names before allocating a string.
 | 
				
			||||||
 | 
							if string(name) == "." || string(name) == ".." {
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							max--
 | 
				
			||||||
 | 
							count++
 | 
				
			||||||
 | 
							names = append(names, string(name))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return origlen - len(buf), count, names
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// +build ppc64 s390x mips mips64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const isBigEndian = true
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,9 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// +build 386 amd64 amd64p32 arm arm64 ppc64le mipsle mips64le
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const isBigEndian = false
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,27 @@
 | 
				
			||||||
 | 
					// Copyright 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Unix environment variables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getenv(key string) (value string, found bool) {
 | 
				
			||||||
 | 
						return syscall.Getenv(key)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setenv(key, value string) error {
 | 
				
			||||||
 | 
						return syscall.Setenv(key, value)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Clearenv() {
 | 
				
			||||||
 | 
						syscall.Clearenv()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Environ() []string {
 | 
				
			||||||
 | 
						return syscall.Environ()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,14 @@
 | 
				
			||||||
 | 
					// Copyright 2014 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build go1.4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Unsetenv(key string) error {
 | 
				
			||||||
 | 
						// This was added in Go 1.4.
 | 
				
			||||||
 | 
						return syscall.Unsetenv(key)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,24 @@
 | 
				
			||||||
 | 
					// +build linux darwin freebsd openbsd netbsd dragonfly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright 2014 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fcntl64Syscall is usually SYS_FCNTL, but is overridden on 32-bit Linux
 | 
				
			||||||
 | 
					// systems by flock_linux_32bit.go to be SYS_FCNTL64.
 | 
				
			||||||
 | 
					var fcntl64Syscall uintptr = SYS_FCNTL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
 | 
				
			||||||
 | 
					func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
 | 
				
			||||||
 | 
						_, _, errno := Syscall(fcntl64Syscall, fd, uintptr(cmd), uintptr(unsafe.Pointer(lk)))
 | 
				
			||||||
 | 
						if errno == 0 {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return errno
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					// +build linux,386 linux,arm linux,mips linux,mipsle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Copyright 2014 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						// On 32-bit Linux systems, the fcntl syscall that matches Go's
 | 
				
			||||||
 | 
						// Flock_t type is SYS_FCNTL64, not SYS_FCNTL.
 | 
				
			||||||
 | 
						fcntl64Syscall = SYS_FCNTL64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,46 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// We can't use the gc-syntax .s files for gccgo.  On the plus side
 | 
				
			||||||
 | 
					// much of the functionality can be written directly in Go.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//extern gccgoRealSyscall
 | 
				
			||||||
 | 
					func realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r, errno uintptr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
 | 
				
			||||||
 | 
						syscall.Entersyscall()
 | 
				
			||||||
 | 
						r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
 | 
				
			||||||
 | 
						syscall.Exitsyscall()
 | 
				
			||||||
 | 
						return r, 0, syscall.Errno(errno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
 | 
				
			||||||
 | 
						syscall.Entersyscall()
 | 
				
			||||||
 | 
						r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)
 | 
				
			||||||
 | 
						syscall.Exitsyscall()
 | 
				
			||||||
 | 
						return r, 0, syscall.Errno(errno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) {
 | 
				
			||||||
 | 
						syscall.Entersyscall()
 | 
				
			||||||
 | 
						r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9)
 | 
				
			||||||
 | 
						syscall.Exitsyscall()
 | 
				
			||||||
 | 
						return r, 0, syscall.Errno(errno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
 | 
				
			||||||
 | 
						r, errno := realSyscall(trap, a1, a2, a3, 0, 0, 0, 0, 0, 0)
 | 
				
			||||||
 | 
						return r, 0, syscall.Errno(errno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno) {
 | 
				
			||||||
 | 
						r, errno := realSyscall(trap, a1, a2, a3, a4, a5, a6, 0, 0, 0)
 | 
				
			||||||
 | 
						return r, 0, syscall.Errno(errno)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _STRINGIFY2_(x) #x
 | 
				
			||||||
 | 
					#define _STRINGIFY_(x) _STRINGIFY2_(x)
 | 
				
			||||||
 | 
					#define GOSYM_PREFIX _STRINGIFY_(__USER_LABEL_PREFIX__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Call syscall from C code because the gccgo support for calling from
 | 
				
			||||||
 | 
					// Go to C does not support varargs functions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ret {
 | 
				
			||||||
 | 
						uintptr_t r;
 | 
				
			||||||
 | 
						uintptr_t err;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ret
 | 
				
			||||||
 | 
					gccgoRealSyscall(uintptr_t trap, uintptr_t a1, uintptr_t a2, uintptr_t a3, uintptr_t a4, uintptr_t a5, uintptr_t a6, uintptr_t a7, uintptr_t a8, uintptr_t a9)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct ret r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						errno = 0;
 | 
				
			||||||
 | 
						r.r = syscall(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9);
 | 
				
			||||||
 | 
						r.err = errno;
 | 
				
			||||||
 | 
						return r;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Define the use function in C so that it is not inlined.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void use(void *) __asm__ (GOSYM_PREFIX GOPKGPATH ".use") __attribute__((noinline));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					use(void *p __attribute__ ((unused)))
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build gccgo,linux,amd64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//extern gettimeofday
 | 
				
			||||||
 | 
					func realGettimeofday(*Timeval, *byte) int32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func gettimeofday(tv *Timeval) (err syscall.Errno) {
 | 
				
			||||||
 | 
						r := realGettimeofday(tv, nil)
 | 
				
			||||||
 | 
						if r < 0 {
 | 
				
			||||||
 | 
							return syscall.GetErrno()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,20 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build gccgo,linux,sparc64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//extern sysconf
 | 
				
			||||||
 | 
					func realSysconf(name int) int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sysconf(name int) (n int64, err syscall.Errno) {
 | 
				
			||||||
 | 
						r := realSysconf(name)
 | 
				
			||||||
 | 
						if r < 0 {
 | 
				
			||||||
 | 
							return 0, syscall.GetErrno()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return r, 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,179 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This script runs or (given -n) prints suggested commands to generate files for
 | 
				
			||||||
 | 
					# the Architecture/OS specified by the GOARCH and GOOS environment variables.
 | 
				
			||||||
 | 
					# See README.md for more information about how the build system works.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GOOSARCH="${GOOS}_${GOARCH}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# defaults
 | 
				
			||||||
 | 
					mksyscall="./mksyscall.pl"
 | 
				
			||||||
 | 
					mkerrors="./mkerrors.sh"
 | 
				
			||||||
 | 
					zerrors="zerrors_$GOOSARCH.go"
 | 
				
			||||||
 | 
					mksysctl=""
 | 
				
			||||||
 | 
					zsysctl="zsysctl_$GOOSARCH.go"
 | 
				
			||||||
 | 
					mksysnum=
 | 
				
			||||||
 | 
					mktypes=
 | 
				
			||||||
 | 
					run="sh"
 | 
				
			||||||
 | 
					cmd=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case "$1" in
 | 
				
			||||||
 | 
					-syscalls)
 | 
				
			||||||
 | 
						for i in zsyscall*go
 | 
				
			||||||
 | 
						do
 | 
				
			||||||
 | 
							# Run the command line that appears in the first line
 | 
				
			||||||
 | 
							# of the generated file to regenerate it.
 | 
				
			||||||
 | 
							sed 1q $i | sed 's;^// ;;' | sh > _$i && gofmt < _$i > $i
 | 
				
			||||||
 | 
							rm _$i
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
						exit 0
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					-n)
 | 
				
			||||||
 | 
						run="cat"
 | 
				
			||||||
 | 
						cmd="echo"
 | 
				
			||||||
 | 
						shift
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case "$#" in
 | 
				
			||||||
 | 
					0)
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					*)
 | 
				
			||||||
 | 
						echo 'usage: mkall.sh [-n]' 1>&2
 | 
				
			||||||
 | 
						exit 2
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ "$GOOS" -eq "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then
 | 
				
			||||||
 | 
						# Use then new build system
 | 
				
			||||||
 | 
						# Files generated through docker (use $cmd so you can Ctl-C the build or run)
 | 
				
			||||||
 | 
						$cmd docker build --tag generate:$GOOS $GOOS
 | 
				
			||||||
 | 
						$cmd docker run --interactive --tty --volume $(dirname "$(readlink -f "$0")"):/build generate:$GOOS
 | 
				
			||||||
 | 
						exit
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					GOOSARCH_in=syscall_$GOOSARCH.go
 | 
				
			||||||
 | 
					case "$GOOSARCH" in
 | 
				
			||||||
 | 
					_* | *_ | _)
 | 
				
			||||||
 | 
						echo 'undefined $GOOS_$GOARCH:' "$GOOSARCH" 1>&2
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					darwin_386)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32"
 | 
				
			||||||
 | 
						mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					darwin_amd64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk macosx)/usr/include/sys/syscall.h"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					darwin_arm)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors"
 | 
				
			||||||
 | 
						mksysnum="./mksysnum_darwin.pl /usr/include/sys/syscall.h"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					darwin_arm64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum="./mksysnum_darwin.pl $(xcrun --show-sdk-path --sdk iphoneos)/usr/include/sys/syscall.h"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					dragonfly_386)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32 -dragonfly"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					dragonfly_amd64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -dragonfly"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://gitweb.dragonflybsd.org/dragonfly.git/blob_plain/HEAD:/sys/kern/syscalls.master' | ./mksysnum_dragonfly.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					freebsd_386)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					freebsd_amd64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					freebsd_arm)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32 -arm"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://svn.freebsd.org/base/stable/10/sys/kern/syscalls.master' | ./mksysnum_freebsd.pl"
 | 
				
			||||||
 | 
						# Let the type of C char be signed for making the bare syscall
 | 
				
			||||||
 | 
						# API consistent across over platforms.
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs -- -fsigned-char"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					linux_sparc64)
 | 
				
			||||||
 | 
						GOOSARCH_in=syscall_linux_sparc64.go
 | 
				
			||||||
 | 
						unistd_h=/usr/include/sparc64-linux-gnu/asm/unistd.h
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum="./mksysnum_linux.pl $unistd_h"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					netbsd_386)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32 -netbsd"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					netbsd_amd64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -netbsd"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_netbsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					openbsd_386)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m32"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -l32 -openbsd"
 | 
				
			||||||
 | 
						mksysctl="./mksysctl_openbsd.pl"
 | 
				
			||||||
 | 
						zsysctl="zsysctl_openbsd.go"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					openbsd_amd64)
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksyscall="./mksyscall.pl -openbsd"
 | 
				
			||||||
 | 
						mksysctl="./mksysctl_openbsd.pl"
 | 
				
			||||||
 | 
						zsysctl="zsysctl_openbsd.go"
 | 
				
			||||||
 | 
						mksysnum="curl -s 'http://cvsweb.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/kern/syscalls.master' | ./mksysnum_openbsd.pl"
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					solaris_amd64)
 | 
				
			||||||
 | 
						mksyscall="./mksyscall_solaris.pl"
 | 
				
			||||||
 | 
						mkerrors="$mkerrors -m64"
 | 
				
			||||||
 | 
						mksysnum=
 | 
				
			||||||
 | 
						mktypes="GOARCH=$GOARCH go tool cgo -godefs"
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					*)
 | 
				
			||||||
 | 
						echo 'unrecognized $GOOS_$GOARCH: ' "$GOOSARCH" 1>&2
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
						;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
						if [ -n "$mkerrors" ]; then echo "$mkerrors |gofmt >$zerrors"; fi
 | 
				
			||||||
 | 
						case "$GOOS" in
 | 
				
			||||||
 | 
						*)
 | 
				
			||||||
 | 
							syscall_goos="syscall_$GOOS.go"
 | 
				
			||||||
 | 
							case "$GOOS" in
 | 
				
			||||||
 | 
							darwin | dragonfly | freebsd | netbsd | openbsd)
 | 
				
			||||||
 | 
								syscall_goos="syscall_bsd.go $syscall_goos"
 | 
				
			||||||
 | 
								;;
 | 
				
			||||||
 | 
							esac
 | 
				
			||||||
 | 
							if [ -n "$mksyscall" ]; then echo "$mksyscall -tags $GOOS,$GOARCH $syscall_goos $GOOSARCH_in |gofmt >zsyscall_$GOOSARCH.go"; fi
 | 
				
			||||||
 | 
							;;
 | 
				
			||||||
 | 
						esac
 | 
				
			||||||
 | 
						if [ -n "$mksysctl" ]; then echo "$mksysctl |gofmt >$zsysctl"; fi
 | 
				
			||||||
 | 
						if [ -n "$mksysnum" ]; then echo "$mksysnum |gofmt >zsysnum_$GOOSARCH.go"; fi
 | 
				
			||||||
 | 
						if [ -n "$mktypes" ]; then
 | 
				
			||||||
 | 
							echo "$mktypes types_$GOOS.go | go run mkpost.go > ztypes_$GOOSARCH.go";
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					) | $run
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,538 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env bash
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Generate Go code listing errors and other #defined constant
 | 
				
			||||||
 | 
					# values (ENAMETOOLONG etc.), by asking the preprocessor
 | 
				
			||||||
 | 
					# about the definitions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unset LANG
 | 
				
			||||||
 | 
					export LC_ALL=C
 | 
				
			||||||
 | 
					export LC_CTYPE=C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if test -z "$GOARCH" -o -z "$GOOS"; then
 | 
				
			||||||
 | 
						echo 1>&2 "GOARCH or GOOS not defined in environment"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check that we are using the new build system if we should
 | 
				
			||||||
 | 
					if [[ "$GOOS" -eq "linux" ]] && [[ "$GOARCH" != "sparc64" ]]; then
 | 
				
			||||||
 | 
						if [[ "$GOLANG_SYS_BUILD" -ne "docker" ]]; then
 | 
				
			||||||
 | 
							echo 1>&2 "In the new build system, mkerrors should not be called directly."
 | 
				
			||||||
 | 
							echo 1>&2 "See README.md"
 | 
				
			||||||
 | 
							exit 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CC=${CC:-cc}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [[ "$GOOS" -eq "solaris" ]]; then
 | 
				
			||||||
 | 
						# Assumes GNU versions of utilities in PATH.
 | 
				
			||||||
 | 
						export PATH=/usr/gnu/bin:$PATH
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uname=$(uname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_Darwin='
 | 
				
			||||||
 | 
					#define _DARWIN_C_SOURCE
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#define _DARWIN_USE_64_BIT_INODE
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_DragonFly='
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <net/ip_mroute/ip_mroute.h>
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_FreeBSD='
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <netinet/ip_mroute.h>
 | 
				
			||||||
 | 
					#include <sys/extattr.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if __FreeBSD__ >= 10
 | 
				
			||||||
 | 
					#define IFT_CARP	0xf8	// IFT_CARP is deprecated in FreeBSD 10
 | 
				
			||||||
 | 
					#undef SIOCAIFADDR
 | 
				
			||||||
 | 
					#define SIOCAIFADDR	_IOW(105, 26, struct oifaliasreq)	// ifaliasreq contains if_data
 | 
				
			||||||
 | 
					#undef SIOCSIFPHYADDR
 | 
				
			||||||
 | 
					#define SIOCSIFPHYADDR	_IOW(105, 70, struct oifaliasreq)	// ifaliasreq contains if_data
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_Linux='
 | 
				
			||||||
 | 
					#define _LARGEFILE_SOURCE
 | 
				
			||||||
 | 
					#define _LARGEFILE64_SOURCE
 | 
				
			||||||
 | 
					#ifndef __LP64__
 | 
				
			||||||
 | 
					#define _FILE_OFFSET_BITS 64
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#define _GNU_SOURCE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// <sys/ioctl.h> is broken on powerpc64, as it fails to include definitions of
 | 
				
			||||||
 | 
					// these structures. We just include them copied from <bits/termios.h>.
 | 
				
			||||||
 | 
					#if defined(__powerpc__)
 | 
				
			||||||
 | 
					struct sgttyb {
 | 
				
			||||||
 | 
					        char    sg_ispeed;
 | 
				
			||||||
 | 
					        char    sg_ospeed;
 | 
				
			||||||
 | 
					        char    sg_erase;
 | 
				
			||||||
 | 
					        char    sg_kill;
 | 
				
			||||||
 | 
					        short   sg_flags;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct tchars {
 | 
				
			||||||
 | 
					        char    t_intrc;
 | 
				
			||||||
 | 
					        char    t_quitc;
 | 
				
			||||||
 | 
					        char    t_startc;
 | 
				
			||||||
 | 
					        char    t_stopc;
 | 
				
			||||||
 | 
					        char    t_eofc;
 | 
				
			||||||
 | 
					        char    t_brkc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ltchars {
 | 
				
			||||||
 | 
					        char    t_suspc;
 | 
				
			||||||
 | 
					        char    t_dsuspc;
 | 
				
			||||||
 | 
					        char    t_rprntc;
 | 
				
			||||||
 | 
					        char    t_flushc;
 | 
				
			||||||
 | 
					        char    t_werasc;
 | 
				
			||||||
 | 
					        char    t_lnextc;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <bits/sockaddr.h>
 | 
				
			||||||
 | 
					#include <sys/epoll.h>
 | 
				
			||||||
 | 
					#include <sys/inotify.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/prctl.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <linux/if.h>
 | 
				
			||||||
 | 
					#include <linux/if_alg.h>
 | 
				
			||||||
 | 
					#include <linux/if_arp.h>
 | 
				
			||||||
 | 
					#include <linux/if_ether.h>
 | 
				
			||||||
 | 
					#include <linux/if_tun.h>
 | 
				
			||||||
 | 
					#include <linux/if_packet.h>
 | 
				
			||||||
 | 
					#include <linux/if_addr.h>
 | 
				
			||||||
 | 
					#include <linux/falloc.h>
 | 
				
			||||||
 | 
					#include <linux/filter.h>
 | 
				
			||||||
 | 
					#include <linux/netlink.h>
 | 
				
			||||||
 | 
					#include <linux/random.h>
 | 
				
			||||||
 | 
					#include <linux/reboot.h>
 | 
				
			||||||
 | 
					#include <linux/rtnetlink.h>
 | 
				
			||||||
 | 
					#include <linux/ptrace.h>
 | 
				
			||||||
 | 
					#include <linux/sched.h>
 | 
				
			||||||
 | 
					#include <linux/wait.h>
 | 
				
			||||||
 | 
					#include <linux/icmpv6.h>
 | 
				
			||||||
 | 
					#include <linux/serial.h>
 | 
				
			||||||
 | 
					#include <linux/can.h>
 | 
				
			||||||
 | 
					#include <linux/vm_sockets.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <asm/termbits.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef MSG_FASTOPEN
 | 
				
			||||||
 | 
					#define MSG_FASTOPEN    0x20000000
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef PTRACE_GETREGS
 | 
				
			||||||
 | 
					#define PTRACE_GETREGS	0xc
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef PTRACE_SETREGS
 | 
				
			||||||
 | 
					#define PTRACE_SETREGS	0xd
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef SOL_NETLINK
 | 
				
			||||||
 | 
					#define SOL_NETLINK	270
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef SOL_BLUETOOTH
 | 
				
			||||||
 | 
					// SPARC includes this in /usr/include/sparc64-linux-gnu/bits/socket.h
 | 
				
			||||||
 | 
					// but it is already in bluetooth_linux.go
 | 
				
			||||||
 | 
					#undef SOL_BLUETOOTH
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_NetBSD='
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/termios.h>
 | 
				
			||||||
 | 
					#include <sys/ttycom.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/in_systm.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <netinet/ip_mroute.h>
 | 
				
			||||||
 | 
					#include <netinet/if_ether.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Needed since <sys/param.h> refers to it...
 | 
				
			||||||
 | 
					#define schedppq 1
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_OpenBSD='
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/termios.h>
 | 
				
			||||||
 | 
					#include <sys/ttycom.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/if_var.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/in_systm.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <netinet/ip_mroute.h>
 | 
				
			||||||
 | 
					#include <netinet/if_ether.h>
 | 
				
			||||||
 | 
					#include <net/if_bridge.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// We keep some constants not supported in OpenBSD 5.5 and beyond for
 | 
				
			||||||
 | 
					// the promise of compatibility.
 | 
				
			||||||
 | 
					#define EMUL_ENABLED		0x1
 | 
				
			||||||
 | 
					#define EMUL_NATIVE		0x2
 | 
				
			||||||
 | 
					#define IPV6_FAITH		0x1d
 | 
				
			||||||
 | 
					#define IPV6_OPTIONS		0x1
 | 
				
			||||||
 | 
					#define IPV6_RTHDR_STRICT	0x1
 | 
				
			||||||
 | 
					#define IPV6_SOCKOPT_RESERVED1	0x3
 | 
				
			||||||
 | 
					#define SIOCGIFGENERIC		0xc020693a
 | 
				
			||||||
 | 
					#define SIOCSIFGENERIC		0x80206939
 | 
				
			||||||
 | 
					#define WALTSIG			0x4
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes_SunOS='
 | 
				
			||||||
 | 
					#include <limits.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/sockio.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <sys/ioctl.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_arp.h>
 | 
				
			||||||
 | 
					#include <net/if_types.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <netinet/ip_mroute.h>
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					includes='
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/file.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/ip.h>
 | 
				
			||||||
 | 
					#include <netinet/ip6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					ccflags="$@"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Write go tool cgo -godefs input.
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
						echo package unix
 | 
				
			||||||
 | 
						echo
 | 
				
			||||||
 | 
						echo '/*'
 | 
				
			||||||
 | 
						indirect="includes_$(uname)"
 | 
				
			||||||
 | 
						echo "${!indirect} $includes"
 | 
				
			||||||
 | 
						echo '*/'
 | 
				
			||||||
 | 
						echo 'import "C"'
 | 
				
			||||||
 | 
						echo 'import "syscall"'
 | 
				
			||||||
 | 
						echo
 | 
				
			||||||
 | 
						echo 'const ('
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# The gcc command line prints all the #defines
 | 
				
			||||||
 | 
						# it encounters while processing the input
 | 
				
			||||||
 | 
						echo "${!indirect} $includes" | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
 | 
						awk '
 | 
				
			||||||
 | 
							$1 != "#define" || $2 ~ /\(/ || $3 == "" {next}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$2 ~ /^E([ABCD]X|[BIS]P|[SD]I|S|FL)$/ {next}  # 386 registers
 | 
				
			||||||
 | 
							$2 ~ /^(SIGEV_|SIGSTKSZ|SIGRT(MIN|MAX))/ {next}
 | 
				
			||||||
 | 
							$2 ~ /^(SCM_SRCRT)$/ {next}
 | 
				
			||||||
 | 
							$2 ~ /^(MAP_FAILED)$/ {next}
 | 
				
			||||||
 | 
							$2 ~ /^ELF_.*$/ {next}# <asm/elf.h> contains ELF_ARCH, etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$2 ~ /^EXTATTR_NAMESPACE_NAMES/ ||
 | 
				
			||||||
 | 
							$2 ~ /^EXTATTR_NAMESPACE_[A-Z]+_STRING/ {next}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$2 !~ /^ETH_/ &&
 | 
				
			||||||
 | 
							$2 !~ /^EPROC_/ &&
 | 
				
			||||||
 | 
							$2 !~ /^EQUIV_/ &&
 | 
				
			||||||
 | 
							$2 !~ /^EXPR_/ &&
 | 
				
			||||||
 | 
							$2 ~ /^E[A-Z0-9_]+$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^B[0-9_]+$/ ||
 | 
				
			||||||
 | 
							$2 == "BOTHER" ||
 | 
				
			||||||
 | 
							$2 ~ /^CI?BAUD(EX)?$/ ||
 | 
				
			||||||
 | 
							$2 == "IBSHIFT" ||
 | 
				
			||||||
 | 
							$2 ~ /^V[A-Z0-9]+$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^CS[A-Z0-9]/ ||
 | 
				
			||||||
 | 
							$2 ~ /^I(SIG|CANON|CRNL|UCLC|EXTEN|MAXBEL|STRIP|UTF8)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^IGN/ ||
 | 
				
			||||||
 | 
							$2 ~ /^IX(ON|ANY|OFF)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^IN(LCR|PCK)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /(^FLU?SH)|(FLU?SH$)/ ||
 | 
				
			||||||
 | 
							$2 ~ /^C(LOCAL|READ|MSPAR|RTSCTS)$/ ||
 | 
				
			||||||
 | 
							$2 == "BRKINT" ||
 | 
				
			||||||
 | 
							$2 == "HUPCL" ||
 | 
				
			||||||
 | 
							$2 == "PENDIN" ||
 | 
				
			||||||
 | 
							$2 == "TOSTOP" ||
 | 
				
			||||||
 | 
							$2 == "XCASE" ||
 | 
				
			||||||
 | 
							$2 == "ALTWERASE" ||
 | 
				
			||||||
 | 
							$2 == "NOKERNINFO" ||
 | 
				
			||||||
 | 
							$2 ~ /^PAR/ ||
 | 
				
			||||||
 | 
							$2 ~ /^SIG[^_]/ ||
 | 
				
			||||||
 | 
							$2 ~ /^O[CNPFPL][A-Z]+[^_][A-Z]+$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(NL|CR|TAB|BS|VT|FF)DLY$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(NL|CR|TAB|BS|VT|FF)[0-9]$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^O?XTABS$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TC[IO](ON|OFF)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^IN_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^LOCK_(SH|EX|NB|UN)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|ICMP6|TCP|EVFILT|NOTE|EV|SHUT|PROT|MAP|PACKET|MSG|SCM|MCL|DT|MADV|PR)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^FALLOC_/ ||
 | 
				
			||||||
 | 
							$2 == "ICMPV6_FILTER" ||
 | 
				
			||||||
 | 
							$2 == "SOMAXCONN" ||
 | 
				
			||||||
 | 
							$2 == "NAME_MAX" ||
 | 
				
			||||||
 | 
							$2 == "IFNAMSIZ" ||
 | 
				
			||||||
 | 
							$2 ~ /^CTL_(MAXNAME|NET|QUERY)$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^SYSCTL_VERS/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(MS|MNT)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TUN(SET|GET|ATTACH|DETACH)/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(O|F|FD|NAME|S|PTRACE|PT)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^LINUX_REBOOT_CMD_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^LINUX_REBOOT_MAGIC[12]$/ ||
 | 
				
			||||||
 | 
							$2 !~ "NLA_TYPE_MASK" &&
 | 
				
			||||||
 | 
							$2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^SIOC/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TIOC/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TCGET/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TCSET/ ||
 | 
				
			||||||
 | 
							$2 ~ /^TC(FLSH|SBRKP?|XONC)$/ ||
 | 
				
			||||||
 | 
							$2 !~ "RTF_BITS" &&
 | 
				
			||||||
 | 
							$2 ~ /^(IFF|IFT|NET_RT|RTM|RTF|RTV|RTA|RTAX)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^BIOC/ ||
 | 
				
			||||||
 | 
							$2 ~ /^RUSAGE_(SELF|CHILDREN|THREAD)/ ||
 | 
				
			||||||
 | 
							$2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|NOFILE|STACK)|RLIM_INFINITY/ ||
 | 
				
			||||||
 | 
							$2 ~ /^PRIO_(PROCESS|PGRP|USER)/ ||
 | 
				
			||||||
 | 
							$2 ~ /^CLONE_[A-Z_]+/ ||
 | 
				
			||||||
 | 
							$2 !~ /^(BPF_TIMEVAL)$/ &&
 | 
				
			||||||
 | 
							$2 ~ /^(BPF|DLT)_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^CLOCK_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^CAN_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^ALG_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^GRND_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^SPLICE_/ ||
 | 
				
			||||||
 | 
							$2 ~ /^(VM|VMADDR)_/ ||
 | 
				
			||||||
 | 
							$2 !~ "WMESGLEN" &&
 | 
				
			||||||
 | 
							$2 ~ /^W[A-Z0-9]+$/ ||
 | 
				
			||||||
 | 
							$2 ~ /^BLK/ {printf("\t%s = C.%s\n", $2, $2)}
 | 
				
			||||||
 | 
							$2 ~ /^__WCOREFLAG$/ {next}
 | 
				
			||||||
 | 
							$2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							{next}
 | 
				
			||||||
 | 
						' | sort
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						echo ')'
 | 
				
			||||||
 | 
					) >_const.go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pull out the error names for later.
 | 
				
			||||||
 | 
					errors=$(
 | 
				
			||||||
 | 
						echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
 | 
						awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print $2 }' |
 | 
				
			||||||
 | 
						sort
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Pull out the signal names for later.
 | 
				
			||||||
 | 
					signals=$(
 | 
				
			||||||
 | 
						echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
 | 
						awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' |
 | 
				
			||||||
 | 
						egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' |
 | 
				
			||||||
 | 
						sort
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Again, writing regexps to a file.
 | 
				
			||||||
 | 
					echo '#include <errno.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
 | 
						awk '$1=="#define" && $2 ~ /^E[A-Z0-9_]+$/ { print "^\t" $2 "[ \t]*=" }' |
 | 
				
			||||||
 | 
						sort >_error.grep
 | 
				
			||||||
 | 
					echo '#include <signal.h>' | $CC -x c - -E -dM $ccflags |
 | 
				
			||||||
 | 
						awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' |
 | 
				
			||||||
 | 
						egrep -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT)' |
 | 
				
			||||||
 | 
						sort >_signal.grep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo '// mkerrors.sh' "$@"
 | 
				
			||||||
 | 
					echo '// Code generated by the command above; see README.md. DO NOT EDIT.'
 | 
				
			||||||
 | 
					echo
 | 
				
			||||||
 | 
					echo "// +build ${GOARCH},${GOOS}"
 | 
				
			||||||
 | 
					echo
 | 
				
			||||||
 | 
					go tool cgo -godefs -- "$@" _const.go >_error.out
 | 
				
			||||||
 | 
					cat _error.out | grep -vf _error.grep | grep -vf _signal.grep
 | 
				
			||||||
 | 
					echo
 | 
				
			||||||
 | 
					echo '// Errors'
 | 
				
			||||||
 | 
					echo 'const ('
 | 
				
			||||||
 | 
					cat _error.out | grep -f _error.grep | sed 's/=\(.*\)/= syscall.Errno(\1)/'
 | 
				
			||||||
 | 
					echo ')'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo
 | 
				
			||||||
 | 
					echo '// Signals'
 | 
				
			||||||
 | 
					echo 'const ('
 | 
				
			||||||
 | 
					cat _error.out | grep -f _signal.grep | sed 's/=\(.*\)/= syscall.Signal(\1)/'
 | 
				
			||||||
 | 
					echo ')'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Run C program to print error and syscall strings.
 | 
				
			||||||
 | 
					(
 | 
				
			||||||
 | 
						echo -E "
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define nelem(x) (sizeof(x)/sizeof((x)[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum { A = 'A', Z = 'Z', a = 'a', z = 'z' }; // avoid need for single quotes below
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int errors[] = {
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
						for i in $errors
 | 
				
			||||||
 | 
						do
 | 
				
			||||||
 | 
							echo -E '	'$i,
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						echo -E "
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int signals[] = {
 | 
				
			||||||
 | 
					"
 | 
				
			||||||
 | 
						for i in $signals
 | 
				
			||||||
 | 
						do
 | 
				
			||||||
 | 
							echo -E '	'$i,
 | 
				
			||||||
 | 
						done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Use -E because on some systems bash builtin interprets \n itself.
 | 
				
			||||||
 | 
						echo -E '
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int
 | 
				
			||||||
 | 
					intcmp(const void *a, const void *b)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return *(int*)a - *(int*)b;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					main(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i, e;
 | 
				
			||||||
 | 
						char buf[1024], *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("\n\n// Error table\n");
 | 
				
			||||||
 | 
						printf("var errors = [...]string {\n");
 | 
				
			||||||
 | 
						qsort(errors, nelem(errors), sizeof errors[0], intcmp);
 | 
				
			||||||
 | 
						for(i=0; i<nelem(errors); i++) {
 | 
				
			||||||
 | 
							e = errors[i];
 | 
				
			||||||
 | 
							if(i > 0 && errors[i-1] == e)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							strcpy(buf, strerror(e));
 | 
				
			||||||
 | 
							// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
 | 
				
			||||||
 | 
							if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
 | 
				
			||||||
 | 
								buf[0] += a - A;
 | 
				
			||||||
 | 
							printf("\t%d: \"%s\",\n", e, buf);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						printf("}\n\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("\n\n// Signal table\n");
 | 
				
			||||||
 | 
						printf("var signals = [...]string {\n");
 | 
				
			||||||
 | 
						qsort(signals, nelem(signals), sizeof signals[0], intcmp);
 | 
				
			||||||
 | 
						for(i=0; i<nelem(signals); i++) {
 | 
				
			||||||
 | 
							e = signals[i];
 | 
				
			||||||
 | 
							if(i > 0 && signals[i-1] == e)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							strcpy(buf, strsignal(e));
 | 
				
			||||||
 | 
							// lowercase first letter: Bad -> bad, but STREAM -> STREAM.
 | 
				
			||||||
 | 
							if(A <= buf[0] && buf[0] <= Z && a <= buf[1] && buf[1] <= z)
 | 
				
			||||||
 | 
								buf[0] += a - A;
 | 
				
			||||||
 | 
							// cut trailing : number.
 | 
				
			||||||
 | 
							p = strrchr(buf, ":"[0]);
 | 
				
			||||||
 | 
							if(p)
 | 
				
			||||||
 | 
								*p = '\0';
 | 
				
			||||||
 | 
							printf("\t%d: \"%s\",\n", e, buf);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						printf("}\n\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'
 | 
				
			||||||
 | 
					) >_errors.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$CC $ccflags -o _errors _errors.c && $GORUN ./_errors && rm -f _errors.c _errors _const.go _error.grep _signal.grep _error.out
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,88 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// mkpost processes the output of cgo -godefs to
 | 
				
			||||||
 | 
					// modify the generated types. It is used to clean up
 | 
				
			||||||
 | 
					// the sys API in an architecture specific manner.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// mkpost is run after cgo -godefs; see README.md.
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bytes"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"go/format"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"regexp"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						// Get the OS and architecture (using GOARCH_TARGET if it exists)
 | 
				
			||||||
 | 
						goos := os.Getenv("GOOS")
 | 
				
			||||||
 | 
						goarch := os.Getenv("GOARCH_TARGET")
 | 
				
			||||||
 | 
						if goarch == "" {
 | 
				
			||||||
 | 
							goarch = os.Getenv("GOARCH")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Check that we are using the new build system if we should be.
 | 
				
			||||||
 | 
						if goos == "linux" && goarch != "sparc64" {
 | 
				
			||||||
 | 
							if os.Getenv("GOLANG_SYS_BUILD") != "docker" {
 | 
				
			||||||
 | 
								os.Stderr.WriteString("In the new build system, mkpost should not be called directly.\n")
 | 
				
			||||||
 | 
								os.Stderr.WriteString("See README.md\n")
 | 
				
			||||||
 | 
								os.Exit(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						b, err := ioutil.ReadAll(os.Stdin)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// If we have empty Ptrace structs, we should delete them. Only s390x emits
 | 
				
			||||||
 | 
						// nonempty Ptrace structs.
 | 
				
			||||||
 | 
						ptraceRexexp := regexp.MustCompile(`type Ptrace((Psw|Fpregs|Per) struct {\s*})`)
 | 
				
			||||||
 | 
						b = ptraceRexexp.ReplaceAll(b, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Replace the control_regs union with a blank identifier for now.
 | 
				
			||||||
 | 
						controlRegsRegex := regexp.MustCompile(`(Control_regs)\s+\[0\]uint64`)
 | 
				
			||||||
 | 
						b = controlRegsRegex.ReplaceAll(b, []byte("_ [0]uint64"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Remove fields that are added by glibc
 | 
				
			||||||
 | 
						// Note that this is unstable as the identifers are private.
 | 
				
			||||||
 | 
						removeFieldsRegex := regexp.MustCompile(`X__glibc\S*`)
 | 
				
			||||||
 | 
						b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// We refuse to export private fields on s390x
 | 
				
			||||||
 | 
						if goarch == "s390x" && goos == "linux" {
 | 
				
			||||||
 | 
							// Remove cgo padding fields
 | 
				
			||||||
 | 
							removeFieldsRegex := regexp.MustCompile(`Pad_cgo_\d+`)
 | 
				
			||||||
 | 
							b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Remove padding, hidden, or unused fields
 | 
				
			||||||
 | 
							removeFieldsRegex = regexp.MustCompile(`X_\S+`)
 | 
				
			||||||
 | 
							b = removeFieldsRegex.ReplaceAll(b, []byte("_"))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Remove the first line of warning from cgo
 | 
				
			||||||
 | 
						b = b[bytes.IndexByte(b, '\n')+1:]
 | 
				
			||||||
 | 
						// Modify the command in the header to include:
 | 
				
			||||||
 | 
						//  mkpost, our own warning, and a build tag.
 | 
				
			||||||
 | 
						replacement := fmt.Sprintf(`$1 | go run mkpost.go
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build %s,%s`, goarch, goos)
 | 
				
			||||||
 | 
						cgoCommandRegex := regexp.MustCompile(`(cgo -godefs .*)`)
 | 
				
			||||||
 | 
						b = cgoCommandRegex.ReplaceAll(b, []byte(replacement))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// gofmt
 | 
				
			||||||
 | 
						b, err = format.Source(b)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						os.Stdout.Write(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,328 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This program reads a file containing function prototypes
 | 
				
			||||||
 | 
					# (like syscall_darwin.go) and generates system call bodies.
 | 
				
			||||||
 | 
					# The prototypes are marked by lines beginning with "//sys"
 | 
				
			||||||
 | 
					# and read like func declarations if //sys is replaced by func, but:
 | 
				
			||||||
 | 
					#	* The parameter lists must give a name for each argument.
 | 
				
			||||||
 | 
					#	  This includes return parameters.
 | 
				
			||||||
 | 
					#	* The parameter lists must give a type for each argument:
 | 
				
			||||||
 | 
					#	  the (x, y, z int) shorthand is not allowed.
 | 
				
			||||||
 | 
					#	* If the return parameter is an error number, it must be named errno.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# A line beginning with //sysnb is like //sys, except that the
 | 
				
			||||||
 | 
					# goroutine will not be suspended during the execution of the system
 | 
				
			||||||
 | 
					# call.  This must only be used for system calls which can never
 | 
				
			||||||
 | 
					# block, as otherwise the system call could cause all goroutines to
 | 
				
			||||||
 | 
					# hang.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $cmdline = "mksyscall.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					my $errors = 0;
 | 
				
			||||||
 | 
					my $_32bit = "";
 | 
				
			||||||
 | 
					my $plan9 = 0;
 | 
				
			||||||
 | 
					my $openbsd = 0;
 | 
				
			||||||
 | 
					my $netbsd = 0;
 | 
				
			||||||
 | 
					my $dragonfly = 0;
 | 
				
			||||||
 | 
					my $arm = 0; # 64-bit value should use (even, odd)-pair
 | 
				
			||||||
 | 
					my $tags = "";  # build tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-b32") {
 | 
				
			||||||
 | 
						$_32bit = "big-endian";
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					} elsif($ARGV[0] eq "-l32") {
 | 
				
			||||||
 | 
						$_32bit = "little-endian";
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-plan9") {
 | 
				
			||||||
 | 
						$plan9 = 1;
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-openbsd") {
 | 
				
			||||||
 | 
						$openbsd = 1;
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-netbsd") {
 | 
				
			||||||
 | 
						$netbsd = 1;
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-dragonfly") {
 | 
				
			||||||
 | 
						$dragonfly = 1;
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-arm") {
 | 
				
			||||||
 | 
						$arm = 1;
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-tags") {
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
						$tags = $ARGV[0];
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ARGV[0] =~ /^-/) {
 | 
				
			||||||
 | 
						print STDERR "usage: mksyscall.pl [-b32 | -l32] [-tags x,y] [file ...]\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check that we are using the new build system if we should
 | 
				
			||||||
 | 
					if($ENV{'GOOS'} eq "linux" || $ENV{'GOARCH'} ne "sparc64") {
 | 
				
			||||||
 | 
						if($ENV{'GOLANG_SYS_BUILD'} ne "docker") {
 | 
				
			||||||
 | 
							print STDERR "In the new build system, mksyscall should not be called directly.\n";
 | 
				
			||||||
 | 
							print STDERR "See README.md\n";
 | 
				
			||||||
 | 
							exit 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub parseparamlist($) {
 | 
				
			||||||
 | 
						my ($list) = @_;
 | 
				
			||||||
 | 
						$list =~ s/^\s*//;
 | 
				
			||||||
 | 
						$list =~ s/\s*$//;
 | 
				
			||||||
 | 
						if($list eq "") {
 | 
				
			||||||
 | 
							return ();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return split(/\s*,\s*/, $list);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub parseparam($) {
 | 
				
			||||||
 | 
						my ($p) = @_;
 | 
				
			||||||
 | 
						if($p !~ /^(\S*) (\S*)$/) {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: malformed parameter: $p\n";
 | 
				
			||||||
 | 
							$errors = 1;
 | 
				
			||||||
 | 
							return ("xx", "int");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ($1, $2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $text = "";
 | 
				
			||||||
 | 
					while(<>) {
 | 
				
			||||||
 | 
						chomp;
 | 
				
			||||||
 | 
						s/\s+/ /g;
 | 
				
			||||||
 | 
						s/^\s+//;
 | 
				
			||||||
 | 
						s/\s+$//;
 | 
				
			||||||
 | 
						my $nonblock = /^\/\/sysnb /;
 | 
				
			||||||
 | 
						next if !/^\/\/sys / && !$nonblock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Line must be of the form
 | 
				
			||||||
 | 
						#	func Open(path string, mode int, perm int) (fd int, errno error)
 | 
				
			||||||
 | 
						# Split into name, in params, out params.
 | 
				
			||||||
 | 
						if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*((?i)SYS_[A-Z0-9_]+))?$/) {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: malformed //sys declaration\n";
 | 
				
			||||||
 | 
							$errors = 1;
 | 
				
			||||||
 | 
							next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						my ($func, $in, $out, $sysname) = ($2, $3, $4, $5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Split argument lists on comma.
 | 
				
			||||||
 | 
						my @in = parseparamlist($in);
 | 
				
			||||||
 | 
						my @out = parseparamlist($out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Try in vain to keep people from editing this file.
 | 
				
			||||||
 | 
						# The theory is that they jump into the middle of the file
 | 
				
			||||||
 | 
						# without reading the header.
 | 
				
			||||||
 | 
						$text .= "// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT\n\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Go function header.
 | 
				
			||||||
 | 
						my $out_decl = @out ? sprintf(" (%s)", join(', ', @out)) : "";
 | 
				
			||||||
 | 
						$text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out_decl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Check if err return available
 | 
				
			||||||
 | 
						my $errvar = "";
 | 
				
			||||||
 | 
						foreach my $p (@out) {
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							if($type eq "error") {
 | 
				
			||||||
 | 
								$errvar = $name;
 | 
				
			||||||
 | 
								last;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Prepare arguments to Syscall.
 | 
				
			||||||
 | 
						my @args = ();
 | 
				
			||||||
 | 
						my $n = 0;
 | 
				
			||||||
 | 
						foreach my $p (@in) {
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							if($type =~ /^\*/) {
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer($name))";
 | 
				
			||||||
 | 
							} elsif($type eq "string" && $errvar ne "") {
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n *byte\n";
 | 
				
			||||||
 | 
								$text .= "\t_p$n, $errvar = BytePtrFromString($name)\n";
 | 
				
			||||||
 | 
								$text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer(_p$n))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type eq "string") {
 | 
				
			||||||
 | 
								print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n";
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n *byte\n";
 | 
				
			||||||
 | 
								$text .= "\t_p$n, _ = BytePtrFromString($name)\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer(_p$n))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type =~ /^\[\](.*)/) {
 | 
				
			||||||
 | 
								# Convert slice into pointer, length.
 | 
				
			||||||
 | 
								# Have to be careful not to take address of &a[0] if len == 0:
 | 
				
			||||||
 | 
								# pass dummy pointer in that case.
 | 
				
			||||||
 | 
								# Used to pass nil, but some OSes or simulators reject write(fd, nil, 0).
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n unsafe.Pointer\n";
 | 
				
			||||||
 | 
								$text .= "\tif len($name) > 0 {\n\t\t_p$n = unsafe.Pointer(\&${name}[0])\n\t}";
 | 
				
			||||||
 | 
								$text .= " else {\n\t\t_p$n = unsafe.Pointer(&_zero)\n\t}";
 | 
				
			||||||
 | 
								$text .= "\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(_p$n)", "uintptr(len($name))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type eq "int64" && ($openbsd || $netbsd)) {
 | 
				
			||||||
 | 
								push @args, "0";
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name>>32)", "uintptr($name)";
 | 
				
			||||||
 | 
								} elsif($_32bit eq "little-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)", "uintptr($name>>32)";
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} elsif($type eq "int64" && $dragonfly) {
 | 
				
			||||||
 | 
								if ($func !~ /^extp(read|write)/i) {
 | 
				
			||||||
 | 
									push @args, "0";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name>>32)", "uintptr($name)";
 | 
				
			||||||
 | 
								} elsif($_32bit eq "little-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)", "uintptr($name>>32)";
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} elsif($type eq "int64" && $_32bit ne "") {
 | 
				
			||||||
 | 
								if(@args % 2 && $arm) {
 | 
				
			||||||
 | 
									# arm abi specifies 64-bit argument uses
 | 
				
			||||||
 | 
									# (even, odd) pair
 | 
				
			||||||
 | 
									push @args, "0"
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name>>32)", "uintptr($name)";
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)", "uintptr($name>>32)";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								push @args, "uintptr($name)";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Determine which form to use; pad args with zeros.
 | 
				
			||||||
 | 
						my $asm = "Syscall";
 | 
				
			||||||
 | 
						if ($nonblock) {
 | 
				
			||||||
 | 
							$asm = "RawSyscall";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if(@args <= 3) {
 | 
				
			||||||
 | 
							while(@args < 3) {
 | 
				
			||||||
 | 
								push @args, "0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} elsif(@args <= 6) {
 | 
				
			||||||
 | 
							$asm .= "6";
 | 
				
			||||||
 | 
							while(@args < 6) {
 | 
				
			||||||
 | 
								push @args, "0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} elsif(@args <= 9) {
 | 
				
			||||||
 | 
							$asm .= "9";
 | 
				
			||||||
 | 
							while(@args < 9) {
 | 
				
			||||||
 | 
								push @args, "0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: too many arguments to system call\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# System call number.
 | 
				
			||||||
 | 
						if($sysname eq "") {
 | 
				
			||||||
 | 
							$sysname = "SYS_$func";
 | 
				
			||||||
 | 
							$sysname =~ s/([a-z])([A-Z])/${1}_$2/g;	# turn FooBar into Foo_Bar
 | 
				
			||||||
 | 
							$sysname =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Actual call.
 | 
				
			||||||
 | 
						my $args = join(', ', @args);
 | 
				
			||||||
 | 
						my $call = "$asm($sysname, $args)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Assign return values.
 | 
				
			||||||
 | 
						my $body = "";
 | 
				
			||||||
 | 
						my @ret = ("_", "_", "_");
 | 
				
			||||||
 | 
						my $do_errno = 0;
 | 
				
			||||||
 | 
						for(my $i=0; $i<@out; $i++) {
 | 
				
			||||||
 | 
							my $p = $out[$i];
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							my $reg = "";
 | 
				
			||||||
 | 
							if($name eq "err" && !$plan9) {
 | 
				
			||||||
 | 
								$reg = "e1";
 | 
				
			||||||
 | 
								$ret[2] = $reg;
 | 
				
			||||||
 | 
								$do_errno = 1;
 | 
				
			||||||
 | 
							} elsif($name eq "err" && $plan9) {
 | 
				
			||||||
 | 
								$ret[0] = "r0";
 | 
				
			||||||
 | 
								$ret[2] = "e1";
 | 
				
			||||||
 | 
								next;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								$reg = sprintf("r%d", $i);
 | 
				
			||||||
 | 
								$ret[$i] = $reg;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($type eq "bool") {
 | 
				
			||||||
 | 
								$reg = "$reg != 0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($type eq "int64" && $_32bit ne "") {
 | 
				
			||||||
 | 
								# 64-bit number in r1:r0 or r0:r1.
 | 
				
			||||||
 | 
								if($i+2 > @out) {
 | 
				
			||||||
 | 
									print STDERR "$ARGV:$.: not enough registers for int64 return\n";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									$reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$ret[$i] = sprintf("r%d", $i);
 | 
				
			||||||
 | 
								$ret[$i+1] = sprintf("r%d", $i+1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($reg ne "e1" || $plan9) {
 | 
				
			||||||
 | 
								$body .= "\t$name = $type($reg)\n";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") {
 | 
				
			||||||
 | 
							$text .= "\t$call\n";
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							$text .= "\t$ret[0], $ret[1], $ret[2] := $call\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$text .= $body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ($plan9 && $ret[2] eq "e1") {
 | 
				
			||||||
 | 
							$text .= "\tif int32(r0) == -1 {\n";
 | 
				
			||||||
 | 
							$text .= "\t\terr = e1\n";
 | 
				
			||||||
 | 
							$text .= "\t}\n";
 | 
				
			||||||
 | 
						} elsif ($do_errno) {
 | 
				
			||||||
 | 
							$text .= "\tif e1 != 0 {\n";
 | 
				
			||||||
 | 
							$text .= "\t\terr = errnoErr(e1)\n";
 | 
				
			||||||
 | 
							$text .= "\t}\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$text .= "\treturn\n";
 | 
				
			||||||
 | 
						$text .= "}\n\n";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chomp $text;
 | 
				
			||||||
 | 
					chomp $text;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($errors) {
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $cmdline
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ syscall.Errno
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$text
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					exit 0;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,289 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This program reads a file containing function prototypes
 | 
				
			||||||
 | 
					# (like syscall_solaris.go) and generates system call bodies.
 | 
				
			||||||
 | 
					# The prototypes are marked by lines beginning with "//sys"
 | 
				
			||||||
 | 
					# and read like func declarations if //sys is replaced by func, but:
 | 
				
			||||||
 | 
					#	* The parameter lists must give a name for each argument.
 | 
				
			||||||
 | 
					#	  This includes return parameters.
 | 
				
			||||||
 | 
					#	* The parameter lists must give a type for each argument:
 | 
				
			||||||
 | 
					#	  the (x, y, z int) shorthand is not allowed.
 | 
				
			||||||
 | 
					#	* If the return parameter is an error number, it must be named err.
 | 
				
			||||||
 | 
					#	* If go func name needs to be different than its libc name,
 | 
				
			||||||
 | 
					#	* or the function is not in libc, name could be specified
 | 
				
			||||||
 | 
					#	* at the end, after "=" sign, like
 | 
				
			||||||
 | 
					#	  //sys getsockopt(s int, level int, name int, val uintptr, vallen *_Socklen) (err error) = libsocket.getsockopt
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $cmdline = "mksyscall_solaris.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					my $errors = 0;
 | 
				
			||||||
 | 
					my $_32bit = "";
 | 
				
			||||||
 | 
					my $tags = "";  # build tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					binmode STDOUT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-b32") {
 | 
				
			||||||
 | 
						$_32bit = "big-endian";
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					} elsif($ARGV[0] eq "-l32") {
 | 
				
			||||||
 | 
						$_32bit = "little-endian";
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					if($ARGV[0] eq "-tags") {
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
						$tags = $ARGV[0];
 | 
				
			||||||
 | 
						shift;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ARGV[0] =~ /^-/) {
 | 
				
			||||||
 | 
						print STDERR "usage: mksyscall_solaris.pl [-b32 | -l32] [-tags x,y] [file ...]\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub parseparamlist($) {
 | 
				
			||||||
 | 
						my ($list) = @_;
 | 
				
			||||||
 | 
						$list =~ s/^\s*//;
 | 
				
			||||||
 | 
						$list =~ s/\s*$//;
 | 
				
			||||||
 | 
						if($list eq "") {
 | 
				
			||||||
 | 
							return ();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return split(/\s*,\s*/, $list);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub parseparam($) {
 | 
				
			||||||
 | 
						my ($p) = @_;
 | 
				
			||||||
 | 
						if($p !~ /^(\S*) (\S*)$/) {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: malformed parameter: $p\n";
 | 
				
			||||||
 | 
							$errors = 1;
 | 
				
			||||||
 | 
							return ("xx", "int");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ($1, $2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $package = "";
 | 
				
			||||||
 | 
					my $text = "";
 | 
				
			||||||
 | 
					my $dynimports = "";
 | 
				
			||||||
 | 
					my $linknames = "";
 | 
				
			||||||
 | 
					my @vars = ();
 | 
				
			||||||
 | 
					while(<>) {
 | 
				
			||||||
 | 
						chomp;
 | 
				
			||||||
 | 
						s/\s+/ /g;
 | 
				
			||||||
 | 
						s/^\s+//;
 | 
				
			||||||
 | 
						s/\s+$//;
 | 
				
			||||||
 | 
						$package = $1 if !$package && /^package (\S+)$/;
 | 
				
			||||||
 | 
						my $nonblock = /^\/\/sysnb /;
 | 
				
			||||||
 | 
						next if !/^\/\/sys / && !$nonblock;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Line must be of the form
 | 
				
			||||||
 | 
						#	func Open(path string, mode int, perm int) (fd int, err error)
 | 
				
			||||||
 | 
						# Split into name, in params, out params.
 | 
				
			||||||
 | 
						if(!/^\/\/sys(nb)? (\w+)\(([^()]*)\)\s*(?:\(([^()]+)\))?\s*(?:=\s*(?:(\w*)\.)?(\w*))?$/) {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: malformed //sys declaration\n";
 | 
				
			||||||
 | 
							$errors = 1;
 | 
				
			||||||
 | 
							next;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						my ($nb, $func, $in, $out, $modname, $sysname) = ($1, $2, $3, $4, $5, $6);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Split argument lists on comma.
 | 
				
			||||||
 | 
						my @in = parseparamlist($in);
 | 
				
			||||||
 | 
						my @out = parseparamlist($out);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# So file name.
 | 
				
			||||||
 | 
						if($modname eq "") {
 | 
				
			||||||
 | 
							$modname = "libc";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# System call name.
 | 
				
			||||||
 | 
						if($sysname eq "") {
 | 
				
			||||||
 | 
							$sysname = "$func";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# System call pointer variable name.
 | 
				
			||||||
 | 
						my $sysvarname = "proc$sysname";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						my $strconvfunc = "BytePtrFromString";
 | 
				
			||||||
 | 
						my $strconvtype = "*byte";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						$sysname =~ y/A-Z/a-z/; # All libc functions are lowercase.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Runtime import of function to allow cross-platform builds.
 | 
				
			||||||
 | 
						$dynimports .= "//go:cgo_import_dynamic libc_${sysname} ${sysname} \"$modname.so\"\n";
 | 
				
			||||||
 | 
						# Link symbol to proc address variable.
 | 
				
			||||||
 | 
						$linknames .= "//go:linkname ${sysvarname} libc_${sysname}\n";
 | 
				
			||||||
 | 
						# Library proc address variable.
 | 
				
			||||||
 | 
						push @vars, $sysvarname;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Go function header.
 | 
				
			||||||
 | 
						$out = join(', ', @out);
 | 
				
			||||||
 | 
						if($out ne "") {
 | 
				
			||||||
 | 
							$out = " ($out)";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if($text ne "") {
 | 
				
			||||||
 | 
							$text .= "\n"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$text .= sprintf "func %s(%s)%s {\n", $func, join(', ', @in), $out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Check if err return available
 | 
				
			||||||
 | 
						my $errvar = "";
 | 
				
			||||||
 | 
						foreach my $p (@out) {
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							if($type eq "error") {
 | 
				
			||||||
 | 
								$errvar = $name;
 | 
				
			||||||
 | 
								last;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Prepare arguments to Syscall.
 | 
				
			||||||
 | 
						my @args = ();
 | 
				
			||||||
 | 
						my $n = 0;
 | 
				
			||||||
 | 
						foreach my $p (@in) {
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							if($type =~ /^\*/) {
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer($name))";
 | 
				
			||||||
 | 
							} elsif($type eq "string" && $errvar ne "") {
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n $strconvtype\n";
 | 
				
			||||||
 | 
								$text .= "\t_p$n, $errvar = $strconvfunc($name)\n";
 | 
				
			||||||
 | 
								$text .= "\tif $errvar != nil {\n\t\treturn\n\t}\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer(_p$n))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type eq "string") {
 | 
				
			||||||
 | 
								print STDERR "$ARGV:$.: $func uses string arguments, but has no error return\n";
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n $strconvtype\n";
 | 
				
			||||||
 | 
								$text .= "\t_p$n, _ = $strconvfunc($name)\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer(_p$n))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type =~ /^\[\](.*)/) {
 | 
				
			||||||
 | 
								# Convert slice into pointer, length.
 | 
				
			||||||
 | 
								# Have to be careful not to take address of &a[0] if len == 0:
 | 
				
			||||||
 | 
								# pass nil in that case.
 | 
				
			||||||
 | 
								$text .= "\tvar _p$n *$1\n";
 | 
				
			||||||
 | 
								$text .= "\tif len($name) > 0 {\n\t\t_p$n = \&$name\[0]\n\t}\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(unsafe.Pointer(_p$n))", "uintptr(len($name))";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} elsif($type eq "int64" && $_32bit ne "") {
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									push @args, "uintptr($name >> 32)", "uintptr($name)";
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									push @args, "uintptr($name)", "uintptr($name >> 32)";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} elsif($type eq "bool") {
 | 
				
			||||||
 | 
					 			$text .= "\tvar _p$n uint32\n";
 | 
				
			||||||
 | 
								$text .= "\tif $name {\n\t\t_p$n = 1\n\t} else {\n\t\t_p$n = 0\n\t}\n";
 | 
				
			||||||
 | 
								push @args, "uintptr(_p$n)";
 | 
				
			||||||
 | 
								$n++;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								push @args, "uintptr($name)";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						my $nargs = @args;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Determine which form to use; pad args with zeros.
 | 
				
			||||||
 | 
						my $asm = "sysvicall6";
 | 
				
			||||||
 | 
						if ($nonblock) {
 | 
				
			||||||
 | 
							$asm = "rawSysvicall6";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if(@args <= 6) {
 | 
				
			||||||
 | 
							while(@args < 6) {
 | 
				
			||||||
 | 
								push @args, "0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							print STDERR "$ARGV:$.: too many arguments to system call\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Actual call.
 | 
				
			||||||
 | 
						my $args = join(', ', @args);
 | 
				
			||||||
 | 
						my $call = "$asm(uintptr(unsafe.Pointer(&$sysvarname)), $nargs, $args)";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Assign return values.
 | 
				
			||||||
 | 
						my $body = "";
 | 
				
			||||||
 | 
						my $failexpr = "";
 | 
				
			||||||
 | 
						my @ret = ("_", "_", "_");
 | 
				
			||||||
 | 
						my @pout= ();
 | 
				
			||||||
 | 
						my $do_errno = 0;
 | 
				
			||||||
 | 
						for(my $i=0; $i<@out; $i++) {
 | 
				
			||||||
 | 
							my $p = $out[$i];
 | 
				
			||||||
 | 
							my ($name, $type) = parseparam($p);
 | 
				
			||||||
 | 
							my $reg = "";
 | 
				
			||||||
 | 
							if($name eq "err") {
 | 
				
			||||||
 | 
								$reg = "e1";
 | 
				
			||||||
 | 
								$ret[2] = $reg;
 | 
				
			||||||
 | 
								$do_errno = 1;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								$reg = sprintf("r%d", $i);
 | 
				
			||||||
 | 
								$ret[$i] = $reg;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($type eq "bool") {
 | 
				
			||||||
 | 
								$reg = "$reg != 0";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($type eq "int64" && $_32bit ne "") {
 | 
				
			||||||
 | 
								# 64-bit number in r1:r0 or r0:r1.
 | 
				
			||||||
 | 
								if($i+2 > @out) {
 | 
				
			||||||
 | 
									print STDERR "$ARGV:$.: not enough registers for int64 return\n";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if($_32bit eq "big-endian") {
 | 
				
			||||||
 | 
									$reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i, $i+1);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$reg = sprintf("int64(r%d)<<32 | int64(r%d)", $i+1, $i);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								$ret[$i] = sprintf("r%d", $i);
 | 
				
			||||||
 | 
								$ret[$i+1] = sprintf("r%d", $i+1);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($reg ne "e1") {
 | 
				
			||||||
 | 
								$body .= "\t$name = $type($reg)\n";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if ($ret[0] eq "_" && $ret[1] eq "_" && $ret[2] eq "_") {
 | 
				
			||||||
 | 
							$text .= "\t$call\n";
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							$text .= "\t$ret[0], $ret[1], $ret[2] := $call\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$text .= $body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ($do_errno) {
 | 
				
			||||||
 | 
							$text .= "\tif e1 != 0 {\n";
 | 
				
			||||||
 | 
							$text .= "\t\terr = e1\n";
 | 
				
			||||||
 | 
							$text .= "\t}\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						$text .= "\treturn\n";
 | 
				
			||||||
 | 
						$text .= "}\n";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($errors) {
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $cmdline
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $tags
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package $package
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print "import \"golang.org/x/sys/unix\"\n" if $package ne "unix";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $vardecls = "\t" . join(",\n\t", @vars);
 | 
				
			||||||
 | 
					$vardecls .= " syscallFunc";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					chomp($_=<<EOF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$dynimports
 | 
				
			||||||
 | 
					$linknames
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
					$vardecls
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$text
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					print $_;
 | 
				
			||||||
 | 
					exit 0;
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,264 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Copyright 2011 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Parse the header files for OpenBSD and generate a Go usable sysctl MIB.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Build a MIB with each entry being an array containing the level, type and
 | 
				
			||||||
 | 
					# a hash that will contain additional entries if the current entry is a node.
 | 
				
			||||||
 | 
					# We then walk this MIB and create a flattened sysctl name to OID hash.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $debug = 0;
 | 
				
			||||||
 | 
					my %ctls = ();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my @headers = qw (
 | 
				
			||||||
 | 
						sys/sysctl.h
 | 
				
			||||||
 | 
						sys/socket.h
 | 
				
			||||||
 | 
						sys/tty.h
 | 
				
			||||||
 | 
						sys/malloc.h
 | 
				
			||||||
 | 
						sys/mount.h
 | 
				
			||||||
 | 
						sys/namei.h
 | 
				
			||||||
 | 
						sys/sem.h
 | 
				
			||||||
 | 
						sys/shm.h
 | 
				
			||||||
 | 
						sys/vmmeter.h
 | 
				
			||||||
 | 
						uvm/uvm_param.h
 | 
				
			||||||
 | 
						uvm/uvm_swap_encrypt.h
 | 
				
			||||||
 | 
						ddb/db_var.h
 | 
				
			||||||
 | 
						net/if.h
 | 
				
			||||||
 | 
						net/if_pfsync.h
 | 
				
			||||||
 | 
						net/pipex.h
 | 
				
			||||||
 | 
						netinet/in.h
 | 
				
			||||||
 | 
						netinet/icmp_var.h
 | 
				
			||||||
 | 
						netinet/igmp_var.h
 | 
				
			||||||
 | 
						netinet/ip_ah.h
 | 
				
			||||||
 | 
						netinet/ip_carp.h
 | 
				
			||||||
 | 
						netinet/ip_divert.h
 | 
				
			||||||
 | 
						netinet/ip_esp.h
 | 
				
			||||||
 | 
						netinet/ip_ether.h
 | 
				
			||||||
 | 
						netinet/ip_gre.h
 | 
				
			||||||
 | 
						netinet/ip_ipcomp.h
 | 
				
			||||||
 | 
						netinet/ip_ipip.h
 | 
				
			||||||
 | 
						netinet/pim_var.h
 | 
				
			||||||
 | 
						netinet/tcp_var.h
 | 
				
			||||||
 | 
						netinet/udp_var.h
 | 
				
			||||||
 | 
						netinet6/in6.h
 | 
				
			||||||
 | 
						netinet6/ip6_divert.h
 | 
				
			||||||
 | 
						netinet6/pim6_var.h
 | 
				
			||||||
 | 
						netinet/icmp6.h
 | 
				
			||||||
 | 
						netmpls/mpls.h
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my @ctls = qw (
 | 
				
			||||||
 | 
						kern
 | 
				
			||||||
 | 
						vm
 | 
				
			||||||
 | 
						fs
 | 
				
			||||||
 | 
						net
 | 
				
			||||||
 | 
						#debug				# Special handling required
 | 
				
			||||||
 | 
						hw
 | 
				
			||||||
 | 
						#machdep			# Arch specific
 | 
				
			||||||
 | 
						user
 | 
				
			||||||
 | 
						ddb
 | 
				
			||||||
 | 
						#vfs				# Special handling required
 | 
				
			||||||
 | 
						fs.posix
 | 
				
			||||||
 | 
						kern.forkstat
 | 
				
			||||||
 | 
						kern.intrcnt
 | 
				
			||||||
 | 
						kern.malloc
 | 
				
			||||||
 | 
						kern.nchstats
 | 
				
			||||||
 | 
						kern.seminfo
 | 
				
			||||||
 | 
						kern.shminfo
 | 
				
			||||||
 | 
						kern.timecounter
 | 
				
			||||||
 | 
						kern.tty
 | 
				
			||||||
 | 
						kern.watchdog
 | 
				
			||||||
 | 
						net.bpf
 | 
				
			||||||
 | 
						net.ifq
 | 
				
			||||||
 | 
						net.inet
 | 
				
			||||||
 | 
						net.inet.ah
 | 
				
			||||||
 | 
						net.inet.carp
 | 
				
			||||||
 | 
						net.inet.divert
 | 
				
			||||||
 | 
						net.inet.esp
 | 
				
			||||||
 | 
						net.inet.etherip
 | 
				
			||||||
 | 
						net.inet.gre
 | 
				
			||||||
 | 
						net.inet.icmp
 | 
				
			||||||
 | 
						net.inet.igmp
 | 
				
			||||||
 | 
						net.inet.ip
 | 
				
			||||||
 | 
						net.inet.ip.ifq
 | 
				
			||||||
 | 
						net.inet.ipcomp
 | 
				
			||||||
 | 
						net.inet.ipip
 | 
				
			||||||
 | 
						net.inet.mobileip
 | 
				
			||||||
 | 
						net.inet.pfsync
 | 
				
			||||||
 | 
						net.inet.pim
 | 
				
			||||||
 | 
						net.inet.tcp
 | 
				
			||||||
 | 
						net.inet.udp
 | 
				
			||||||
 | 
						net.inet6
 | 
				
			||||||
 | 
						net.inet6.divert
 | 
				
			||||||
 | 
						net.inet6.ip6
 | 
				
			||||||
 | 
						net.inet6.icmp6
 | 
				
			||||||
 | 
						net.inet6.pim6
 | 
				
			||||||
 | 
						net.inet6.tcp6
 | 
				
			||||||
 | 
						net.inet6.udp6
 | 
				
			||||||
 | 
						net.mpls
 | 
				
			||||||
 | 
						net.mpls.ifq
 | 
				
			||||||
 | 
						net.key
 | 
				
			||||||
 | 
						net.pflow
 | 
				
			||||||
 | 
						net.pfsync
 | 
				
			||||||
 | 
						net.pipex
 | 
				
			||||||
 | 
						net.rt
 | 
				
			||||||
 | 
						vm.swapencrypt
 | 
				
			||||||
 | 
						#vfsgenctl			# Special handling required
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Node name "fixups"
 | 
				
			||||||
 | 
					my %ctl_map = (
 | 
				
			||||||
 | 
						"ipproto" => "net.inet",
 | 
				
			||||||
 | 
						"net.inet.ipproto" => "net.inet",
 | 
				
			||||||
 | 
						"net.inet6.ipv6proto" => "net.inet6",
 | 
				
			||||||
 | 
						"net.inet6.ipv6" => "net.inet6.ip6",
 | 
				
			||||||
 | 
						"net.inet.icmpv6" => "net.inet6.icmp6",
 | 
				
			||||||
 | 
						"net.inet6.divert6" => "net.inet6.divert",
 | 
				
			||||||
 | 
						"net.inet6.tcp6" => "net.inet.tcp",
 | 
				
			||||||
 | 
						"net.inet6.udp6" => "net.inet.udp",
 | 
				
			||||||
 | 
						"mpls" => "net.mpls",
 | 
				
			||||||
 | 
						"swpenc" => "vm.swapencrypt"
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Node mappings
 | 
				
			||||||
 | 
					my %node_map = (
 | 
				
			||||||
 | 
						"net.inet.ip.ifq" => "net.ifq",
 | 
				
			||||||
 | 
						"net.inet.pfsync" => "net.pfsync",
 | 
				
			||||||
 | 
						"net.mpls.ifq" => "net.ifq"
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $ctlname;
 | 
				
			||||||
 | 
					my %mib = ();
 | 
				
			||||||
 | 
					my %sysctl = ();
 | 
				
			||||||
 | 
					my $node;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sub debug() {
 | 
				
			||||||
 | 
						print STDERR "$_[0]\n" if $debug;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Walk the MIB and build a sysctl name to OID mapping.
 | 
				
			||||||
 | 
					sub build_sysctl() {
 | 
				
			||||||
 | 
						my ($node, $name, $oid) = @_;
 | 
				
			||||||
 | 
						my %node = %{$node};
 | 
				
			||||||
 | 
						my @oid = @{$oid};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						foreach my $key (sort keys %node) {
 | 
				
			||||||
 | 
							my @node = @{$node{$key}};
 | 
				
			||||||
 | 
							my $nodename = $name.($name ne '' ? '.' : '').$key;
 | 
				
			||||||
 | 
							my @nodeoid = (@oid, $node[0]);
 | 
				
			||||||
 | 
							if ($node[1] eq 'CTLTYPE_NODE') {
 | 
				
			||||||
 | 
								if (exists $node_map{$nodename}) {
 | 
				
			||||||
 | 
									$node = \%mib;
 | 
				
			||||||
 | 
									$ctlname = $node_map{$nodename};
 | 
				
			||||||
 | 
									foreach my $part (split /\./, $ctlname) {
 | 
				
			||||||
 | 
										$node = \%{@{$$node{$part}}[2]};
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									$node = $node[2];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								&build_sysctl($node, $nodename, \@nodeoid);
 | 
				
			||||||
 | 
							} elsif ($node[1] ne '') {
 | 
				
			||||||
 | 
								$sysctl{$nodename} = \@nodeoid;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					foreach my $ctl (@ctls) {
 | 
				
			||||||
 | 
						$ctls{$ctl} = $ctl;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Build MIB
 | 
				
			||||||
 | 
					foreach my $header (@headers) {
 | 
				
			||||||
 | 
						&debug("Processing $header...");
 | 
				
			||||||
 | 
						open HEADER, "/usr/include/$header" ||
 | 
				
			||||||
 | 
						    print STDERR "Failed to open $header\n";
 | 
				
			||||||
 | 
						while (<HEADER>) {
 | 
				
			||||||
 | 
							if ($_ =~ /^#define\s+(CTL_NAMES)\s+{/ ||
 | 
				
			||||||
 | 
							    $_ =~ /^#define\s+(CTL_(.*)_NAMES)\s+{/ ||
 | 
				
			||||||
 | 
							    $_ =~ /^#define\s+((.*)CTL_NAMES)\s+{/) {
 | 
				
			||||||
 | 
								if ($1 eq 'CTL_NAMES') {
 | 
				
			||||||
 | 
									# Top level.
 | 
				
			||||||
 | 
									$node = \%mib;
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									# Node.
 | 
				
			||||||
 | 
									my $nodename = lc($2);
 | 
				
			||||||
 | 
									if ($header =~ /^netinet\//) {
 | 
				
			||||||
 | 
										$ctlname = "net.inet.$nodename";
 | 
				
			||||||
 | 
									} elsif ($header =~ /^netinet6\//) {
 | 
				
			||||||
 | 
										$ctlname = "net.inet6.$nodename";
 | 
				
			||||||
 | 
									} elsif ($header =~ /^net\//) {
 | 
				
			||||||
 | 
										$ctlname = "net.$nodename";
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										$ctlname = "$nodename";
 | 
				
			||||||
 | 
										$ctlname =~ s/^(fs|net|kern)_/$1\./;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (exists $ctl_map{$ctlname}) {
 | 
				
			||||||
 | 
										$ctlname = $ctl_map{$ctlname};
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (not exists $ctls{$ctlname}) {
 | 
				
			||||||
 | 
										&debug("Ignoring $ctlname...");
 | 
				
			||||||
 | 
										next;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									# Walk down from the top of the MIB.
 | 
				
			||||||
 | 
									$node = \%mib;
 | 
				
			||||||
 | 
									foreach my $part (split /\./, $ctlname) {
 | 
				
			||||||
 | 
										if (not exists $$node{$part}) {
 | 
				
			||||||
 | 
											&debug("Missing node $part");
 | 
				
			||||||
 | 
											$$node{$part} = [ 0, '', {} ];
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										$node = \%{@{$$node{$part}}[2]};
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								# Populate current node with entries.
 | 
				
			||||||
 | 
								my $i = -1;
 | 
				
			||||||
 | 
								while (defined($_) && $_ !~ /^}/) {
 | 
				
			||||||
 | 
									$_ = <HEADER>;
 | 
				
			||||||
 | 
									$i++ if $_ =~ /{.*}/;
 | 
				
			||||||
 | 
									next if $_ !~ /{\s+"(\w+)",\s+(CTLTYPE_[A-Z]+)\s+}/;
 | 
				
			||||||
 | 
									$$node{$1} = [ $i, $2, {} ];
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						close HEADER;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					&build_sysctl(\%mib, "", []);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// mksysctl_openbsd.pl
 | 
				
			||||||
 | 
					// MACHINE GENERATED BY THE ABOVE COMMAND; DO NOT EDIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mibentry struct {
 | 
				
			||||||
 | 
						ctlname string
 | 
				
			||||||
 | 
						ctloid []_C_int
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var sysctlMib = []mibentry {
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					foreach my $name (sort keys %sysctl) {
 | 
				
			||||||
 | 
						my @oid = @{$sysctl{$name}};
 | 
				
			||||||
 | 
						print "\t{ \"$name\", []_C_int{ ", join(', ', @oid), " } }, \n";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,39 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Generate system call table for Darwin from sys/syscall.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $command = "mksysnum_darwin.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $command
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while(<>){
 | 
				
			||||||
 | 
						if(/^#define\s+SYS_(\w+)\s+([0-9]+)/){
 | 
				
			||||||
 | 
							my $name = $1;
 | 
				
			||||||
 | 
							my $num = $2;
 | 
				
			||||||
 | 
							$name =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
							print "	SYS_$name = $num;"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Generate system call table for DragonFly from master list
 | 
				
			||||||
 | 
					# (for example, /usr/src/sys/kern/syscalls.master).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $command = "mksysnum_dragonfly.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $command
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while(<>){
 | 
				
			||||||
 | 
						if(/^([0-9]+)\s+STD\s+({ \S+\s+(\w+).*)$/){
 | 
				
			||||||
 | 
							my $num = $1;
 | 
				
			||||||
 | 
							my $proto = $2;
 | 
				
			||||||
 | 
							my $name = "SYS_$3";
 | 
				
			||||||
 | 
							$name =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# There are multiple entries for enosys and nosys, so comment them out.
 | 
				
			||||||
 | 
							if($name =~ /^SYS_E?NOSYS$/){
 | 
				
			||||||
 | 
								$name = "// $name";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($name eq 'SYS_SYS_EXIT'){
 | 
				
			||||||
 | 
								$name = 'SYS_EXIT';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							print "	$name = $num;  // $proto\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,63 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Generate system call table for FreeBSD from master list
 | 
				
			||||||
 | 
					# (for example, /usr/src/sys/kern/syscalls.master).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $command = "mksysnum_freebsd.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $command
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while(<>){
 | 
				
			||||||
 | 
						if(/^([0-9]+)\s+\S+\s+STD\s+({ \S+\s+(\w+).*)$/){
 | 
				
			||||||
 | 
							my $num = $1;
 | 
				
			||||||
 | 
							my $proto = $2;
 | 
				
			||||||
 | 
							my $name = "SYS_$3";
 | 
				
			||||||
 | 
							$name =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# There are multiple entries for enosys and nosys, so comment them out.
 | 
				
			||||||
 | 
							if($name =~ /^SYS_E?NOSYS$/){
 | 
				
			||||||
 | 
								$name = "// $name";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($name eq 'SYS_SYS_EXIT'){
 | 
				
			||||||
 | 
								$name = 'SYS_EXIT';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($name =~ /^SYS_CAP_+/ || $name =~ /^SYS___CAP_+/){
 | 
				
			||||||
 | 
								next
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							print "	$name = $num;  // $proto\n";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# We keep Capsicum syscall numbers for FreeBSD
 | 
				
			||||||
 | 
							# 9-STABLE here because we are not sure whether they
 | 
				
			||||||
 | 
							# are mature and stable.
 | 
				
			||||||
 | 
							if($num == 513){
 | 
				
			||||||
 | 
								print " SYS_CAP_NEW = 514 // { int cap_new(int fd, uint64_t rights); }\n";
 | 
				
			||||||
 | 
								print " SYS_CAP_GETRIGHTS = 515 // { int cap_getrights(int fd, \\\n";
 | 
				
			||||||
 | 
								print " SYS_CAP_ENTER = 516 // { int cap_enter(void); }\n";
 | 
				
			||||||
 | 
								print " SYS_CAP_GETMODE = 517 // { int cap_getmode(u_int *modep); }\n";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,58 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Generate system call table for OpenBSD from master list
 | 
				
			||||||
 | 
					# (for example, /usr/src/sys/kern/syscalls.master).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $command = "mksysnum_netbsd.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $command
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $line = '';
 | 
				
			||||||
 | 
					while(<>){
 | 
				
			||||||
 | 
						if($line =~ /^(.*)\\$/) {
 | 
				
			||||||
 | 
							# Handle continuation
 | 
				
			||||||
 | 
							$line = $1;
 | 
				
			||||||
 | 
							$_ =~ s/^\s+//;
 | 
				
			||||||
 | 
							$line .= $_;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							# New line
 | 
				
			||||||
 | 
							$line = $_;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						next if $line =~ /\\$/;
 | 
				
			||||||
 | 
						if($line =~ /^([0-9]+)\s+((STD)|(NOERR))\s+(RUMP\s+)?({\s+\S+\s*\*?\s*\|(\S+)\|(\S*)\|(\w+).*\s+})(\s+(\S+))?$/) {
 | 
				
			||||||
 | 
							my $num = $1;
 | 
				
			||||||
 | 
							my $proto = $6;
 | 
				
			||||||
 | 
							my $compat = $8;
 | 
				
			||||||
 | 
							my $name = "$7_$9";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							$name = "$7_$11" if $11 ne '';
 | 
				
			||||||
 | 
							$name =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if($compat eq '' || $compat eq '30' || $compat eq '50') {
 | 
				
			||||||
 | 
								print "	$name = $num;  // $proto\n";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					#!/usr/bin/env perl
 | 
				
			||||||
 | 
					# Copyright 2009 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.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Generate system call table for OpenBSD from master list
 | 
				
			||||||
 | 
					# (for example, /usr/src/sys/kern/syscalls.master).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					use strict;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if($ENV{'GOARCH'} eq "" || $ENV{'GOOS'} eq "") {
 | 
				
			||||||
 | 
						print STDERR "GOARCH or GOOS not defined in environment\n";
 | 
				
			||||||
 | 
						exit 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					my $command = "mksysnum_openbsd.pl " . join(' ', @ARGV);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					// $command
 | 
				
			||||||
 | 
					// Code generated by the command above; see README.md. DO NOT EDIT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build $ENV{'GOARCH'},$ENV{'GOOS'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					while(<>){
 | 
				
			||||||
 | 
						if(/^([0-9]+)\s+STD\s+(NOLOCK\s+)?({ \S+\s+\*?(\w+).*)$/){
 | 
				
			||||||
 | 
							my $num = $1;
 | 
				
			||||||
 | 
							my $proto = $3;
 | 
				
			||||||
 | 
							my $name = $4;
 | 
				
			||||||
 | 
							$name =~ y/a-z/A-Z/;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							# There are multiple entries for enosys and nosys, so comment them out.
 | 
				
			||||||
 | 
							if($name =~ /^SYS_E?NOSYS$/){
 | 
				
			||||||
 | 
								$name = "// $name";
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if($name eq 'SYS_SYS_EXIT'){
 | 
				
			||||||
 | 
								$name = 'SYS_EXIT';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							print "	$name = $num;  // $proto\n";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print <<EOF;
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					EOF
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,38 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build openbsd
 | 
				
			||||||
 | 
					// +build 386 amd64 arm
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SYS_PLEDGE = 108
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Pledge implements the pledge syscall. For more information see pledge(2).
 | 
				
			||||||
 | 
					func Pledge(promises string, paths []string) error {
 | 
				
			||||||
 | 
						promisesPtr, err := syscall.BytePtrFromString(promises)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						promisesUnsafe, pathsUnsafe := unsafe.Pointer(promisesPtr), unsafe.Pointer(nil)
 | 
				
			||||||
 | 
						if paths != nil {
 | 
				
			||||||
 | 
							var pathsPtr []*byte
 | 
				
			||||||
 | 
							if pathsPtr, err = syscall.SlicePtrFromStrings(paths); err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							pathsUnsafe = unsafe.Pointer(&pathsPtr[0])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, _, e := syscall.Syscall(SYS_PLEDGE, uintptr(promisesUnsafe), uintptr(pathsUnsafe), 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							return e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					// Copyright 2012 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin,race linux,race freebsd,race
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const raceenabled = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceAcquire(addr unsafe.Pointer) {
 | 
				
			||||||
 | 
						runtime.RaceAcquire(addr)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceReleaseMerge(addr unsafe.Pointer) {
 | 
				
			||||||
 | 
						runtime.RaceReleaseMerge(addr)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceReadRange(addr unsafe.Pointer, len int) {
 | 
				
			||||||
 | 
						runtime.RaceReadRange(addr, len)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceWriteRange(addr unsafe.Pointer, len int) {
 | 
				
			||||||
 | 
						runtime.RaceWriteRange(addr, len)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					// Copyright 2012 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin,!race linux,!race freebsd,!race netbsd openbsd solaris dragonfly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const raceenabled = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceAcquire(addr unsafe.Pointer) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceReleaseMerge(addr unsafe.Pointer) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceReadRange(addr unsafe.Pointer, len int) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func raceWriteRange(addr unsafe.Pointer, len int) {
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,36 @@
 | 
				
			||||||
 | 
					// Copyright 2011 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Socket control messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnixCredentials encodes credentials into a socket control message
 | 
				
			||||||
 | 
					// for sending to another process. This can be used for
 | 
				
			||||||
 | 
					// authentication.
 | 
				
			||||||
 | 
					func UnixCredentials(ucred *Ucred) []byte {
 | 
				
			||||||
 | 
						b := make([]byte, CmsgSpace(SizeofUcred))
 | 
				
			||||||
 | 
						h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
 | 
				
			||||||
 | 
						h.Level = SOL_SOCKET
 | 
				
			||||||
 | 
						h.Type = SCM_CREDENTIALS
 | 
				
			||||||
 | 
						h.SetLen(CmsgLen(SizeofUcred))
 | 
				
			||||||
 | 
						*((*Ucred)(cmsgData(h))) = *ucred
 | 
				
			||||||
 | 
						return b
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseUnixCredentials decodes a socket control message that contains
 | 
				
			||||||
 | 
					// credentials in a Ucred structure. To receive such a message, the
 | 
				
			||||||
 | 
					// SO_PASSCRED option must be enabled on the socket.
 | 
				
			||||||
 | 
					func ParseUnixCredentials(m *SocketControlMessage) (*Ucred, error) {
 | 
				
			||||||
 | 
						if m.Header.Level != SOL_SOCKET {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if m.Header.Type != SCM_CREDENTIALS {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						ucred := *(*Ucred)(unsafe.Pointer(&m.Data[0]))
 | 
				
			||||||
 | 
						return &ucred, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,103 @@
 | 
				
			||||||
 | 
					// Copyright 2011 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Socket control messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Round the length of a raw sockaddr up to align it properly.
 | 
				
			||||||
 | 
					func cmsgAlignOf(salen int) int {
 | 
				
			||||||
 | 
						salign := sizeofPtr
 | 
				
			||||||
 | 
						// NOTE: It seems like 64-bit Darwin and DragonFly BSD kernels
 | 
				
			||||||
 | 
						// still require 32-bit aligned access to network subsystem.
 | 
				
			||||||
 | 
						if darwin64Bit || dragonfly64Bit {
 | 
				
			||||||
 | 
							salign = 4
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return (salen + salign - 1) & ^(salign - 1)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CmsgLen returns the value to store in the Len field of the Cmsghdr
 | 
				
			||||||
 | 
					// structure, taking into account any necessary alignment.
 | 
				
			||||||
 | 
					func CmsgLen(datalen int) int {
 | 
				
			||||||
 | 
						return cmsgAlignOf(SizeofCmsghdr) + datalen
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// CmsgSpace returns the number of bytes an ancillary element with
 | 
				
			||||||
 | 
					// payload of the passed data length occupies.
 | 
				
			||||||
 | 
					func CmsgSpace(datalen int) int {
 | 
				
			||||||
 | 
						return cmsgAlignOf(SizeofCmsghdr) + cmsgAlignOf(datalen)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func cmsgData(h *Cmsghdr) unsafe.Pointer {
 | 
				
			||||||
 | 
						return unsafe.Pointer(uintptr(unsafe.Pointer(h)) + uintptr(cmsgAlignOf(SizeofCmsghdr)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SocketControlMessage represents a socket control message.
 | 
				
			||||||
 | 
					type SocketControlMessage struct {
 | 
				
			||||||
 | 
						Header Cmsghdr
 | 
				
			||||||
 | 
						Data   []byte
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseSocketControlMessage parses b as an array of socket control
 | 
				
			||||||
 | 
					// messages.
 | 
				
			||||||
 | 
					func ParseSocketControlMessage(b []byte) ([]SocketControlMessage, error) {
 | 
				
			||||||
 | 
						var msgs []SocketControlMessage
 | 
				
			||||||
 | 
						i := 0
 | 
				
			||||||
 | 
						for i+CmsgLen(0) <= len(b) {
 | 
				
			||||||
 | 
							h, dbuf, err := socketControlMessageHeaderAndData(b[i:])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							m := SocketControlMessage{Header: *h, Data: dbuf}
 | 
				
			||||||
 | 
							msgs = append(msgs, m)
 | 
				
			||||||
 | 
							i += cmsgAlignOf(int(h.Len))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return msgs, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socketControlMessageHeaderAndData(b []byte) (*Cmsghdr, []byte, error) {
 | 
				
			||||||
 | 
						h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
 | 
				
			||||||
 | 
						if h.Len < SizeofCmsghdr || uint64(h.Len) > uint64(len(b)) {
 | 
				
			||||||
 | 
							return nil, nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return h, b[cmsgAlignOf(SizeofCmsghdr):h.Len], nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// UnixRights encodes a set of open file descriptors into a socket
 | 
				
			||||||
 | 
					// control message for sending to another process.
 | 
				
			||||||
 | 
					func UnixRights(fds ...int) []byte {
 | 
				
			||||||
 | 
						datalen := len(fds) * 4
 | 
				
			||||||
 | 
						b := make([]byte, CmsgSpace(datalen))
 | 
				
			||||||
 | 
						h := (*Cmsghdr)(unsafe.Pointer(&b[0]))
 | 
				
			||||||
 | 
						h.Level = SOL_SOCKET
 | 
				
			||||||
 | 
						h.Type = SCM_RIGHTS
 | 
				
			||||||
 | 
						h.SetLen(CmsgLen(datalen))
 | 
				
			||||||
 | 
						data := cmsgData(h)
 | 
				
			||||||
 | 
						for _, fd := range fds {
 | 
				
			||||||
 | 
							*(*int32)(data) = int32(fd)
 | 
				
			||||||
 | 
							data = unsafe.Pointer(uintptr(data) + 4)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return b
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ParseUnixRights decodes a socket control message that contains an
 | 
				
			||||||
 | 
					// integer array of open file descriptors from another process.
 | 
				
			||||||
 | 
					func ParseUnixRights(m *SocketControlMessage) ([]int, error) {
 | 
				
			||||||
 | 
						if m.Header.Level != SOL_SOCKET {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if m.Header.Type != SCM_RIGHTS {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fds := make([]int, len(m.Data)>>2)
 | 
				
			||||||
 | 
						for i, j := 0, 0; i < len(m.Data); i += 4 {
 | 
				
			||||||
 | 
							fds[j] = int(*(*int32)(unsafe.Pointer(&m.Data[i])))
 | 
				
			||||||
 | 
							j++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fds, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,26 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func itoa(val int) string { // do it here rather than with fmt to avoid dependency
 | 
				
			||||||
 | 
						if val < 0 {
 | 
				
			||||||
 | 
							return "-" + uitoa(uint(-val))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return uitoa(uint(val))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func uitoa(val uint) string {
 | 
				
			||||||
 | 
						var buf [32]byte // big enough for int64
 | 
				
			||||||
 | 
						i := len(buf) - 1
 | 
				
			||||||
 | 
						for val >= 10 {
 | 
				
			||||||
 | 
							buf[i] = byte(val%10 + '0')
 | 
				
			||||||
 | 
							i--
 | 
				
			||||||
 | 
							val /= 10
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						buf[i] = byte(val + '0')
 | 
				
			||||||
 | 
						return string(buf[i:])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Package unix contains an interface to the low-level operating system
 | 
				
			||||||
 | 
					// primitives.  OS details vary depending on the underlying system, and
 | 
				
			||||||
 | 
					// by default, godoc will display OS-specific documentation for the current
 | 
				
			||||||
 | 
					// system.  If you want godoc to display OS documentation for another
 | 
				
			||||||
 | 
					// system, set $GOOS and $GOARCH to the desired system.  For example, if
 | 
				
			||||||
 | 
					// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
 | 
				
			||||||
 | 
					// to freebsd and $GOARCH to arm.
 | 
				
			||||||
 | 
					// The primary use of this package is inside other packages that provide a more
 | 
				
			||||||
 | 
					// portable interface to the system, such as "os", "time" and "net".  Use
 | 
				
			||||||
 | 
					// those packages rather than this one if you can.
 | 
				
			||||||
 | 
					// For details of the functions and data types in this package consult
 | 
				
			||||||
 | 
					// the manuals for the appropriate operating system.
 | 
				
			||||||
 | 
					// These calls return err == nil to indicate success; otherwise
 | 
				
			||||||
 | 
					// err represents an operating system error describing the failure and
 | 
				
			||||||
 | 
					// holds a value of type syscall.Errno.
 | 
				
			||||||
 | 
					package unix // import "golang.org/x/sys/unix"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ByteSliceFromString returns a NUL-terminated slice of bytes
 | 
				
			||||||
 | 
					// containing the text of s. If s contains a NUL byte at any
 | 
				
			||||||
 | 
					// location, it returns (nil, EINVAL).
 | 
				
			||||||
 | 
					func ByteSliceFromString(s string) ([]byte, error) {
 | 
				
			||||||
 | 
						for i := 0; i < len(s); i++ {
 | 
				
			||||||
 | 
							if s[i] == 0 {
 | 
				
			||||||
 | 
								return nil, EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						a := make([]byte, len(s)+1)
 | 
				
			||||||
 | 
						copy(a, s)
 | 
				
			||||||
 | 
						return a, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BytePtrFromString returns a pointer to a NUL-terminated array of
 | 
				
			||||||
 | 
					// bytes containing the text of s. If s contains a NUL byte at any
 | 
				
			||||||
 | 
					// location, it returns (nil, EINVAL).
 | 
				
			||||||
 | 
					func BytePtrFromString(s string) (*byte, error) {
 | 
				
			||||||
 | 
						a, err := ByteSliceFromString(s)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &a[0], nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Single-word zero for use when we need a valid pointer to 0 bytes.
 | 
				
			||||||
 | 
					// See mkunix.pl.
 | 
				
			||||||
 | 
					var _zero uintptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ts *Timespec) Unix() (sec int64, nsec int64) {
 | 
				
			||||||
 | 
						return int64(ts.Sec), int64(ts.Nsec)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (tv *Timeval) Unix() (sec int64, nsec int64) {
 | 
				
			||||||
 | 
						return int64(tv.Sec), int64(tv.Usec) * 1000
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ts *Timespec) Nano() int64 {
 | 
				
			||||||
 | 
						return int64(ts.Sec)*1e9 + int64(ts.Nsec)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (tv *Timeval) Nano() int64 {
 | 
				
			||||||
 | 
						return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimevalToNsec(tv Timeval) int64 { return int64(tv.Sec)*1e9 + int64(tv.Usec)*1e3 }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,614 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd netbsd openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// BSD system call wrappers shared by *BSD based systems
 | 
				
			||||||
 | 
					// including OS X (Darwin) and FreeBSD.  Like the other
 | 
				
			||||||
 | 
					// syscall_*.go files it is compiled as Go code but also
 | 
				
			||||||
 | 
					// used as input to mksyscall which parses the //sys
 | 
				
			||||||
 | 
					// lines and generates system call stubs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Wrapped
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	getgroups(ngid int, gid *_Gid_t) (n int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(ngid int, gid *_Gid_t) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getgroups() (gids []int, err error) {
 | 
				
			||||||
 | 
						n, err := getgroups(0, nil)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n == 0 {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Sanity check group count.  Max is 16 on BSD.
 | 
				
			||||||
 | 
						if n < 0 || n > 1000 {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						a := make([]_Gid_t, n)
 | 
				
			||||||
 | 
						n, err = getgroups(n, &a[0])
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						gids = make([]int, n)
 | 
				
			||||||
 | 
						for i, v := range a[0:n] {
 | 
				
			||||||
 | 
							gids[i] = int(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setgroups(gids []int) (err error) {
 | 
				
			||||||
 | 
						if len(gids) == 0 {
 | 
				
			||||||
 | 
							return setgroups(0, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						a := make([]_Gid_t, len(gids))
 | 
				
			||||||
 | 
						for i, v := range gids {
 | 
				
			||||||
 | 
							a[i] = _Gid_t(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return setgroups(len(a), &a[0])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ReadDirent(fd int, buf []byte) (n int, err error) {
 | 
				
			||||||
 | 
						// Final argument is (basep *uintptr) and the syscall doesn't take nil.
 | 
				
			||||||
 | 
						// 64 bits should be enough. (32 bits isn't even on 386). Since the
 | 
				
			||||||
 | 
						// actual system call is getdirentries64, 64 is a good guess.
 | 
				
			||||||
 | 
						// TODO(rsc): Can we use a single global basep for all calls?
 | 
				
			||||||
 | 
						var base = (*uintptr)(unsafe.Pointer(new(uint64)))
 | 
				
			||||||
 | 
						return Getdirentries(fd, buf, base)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Wait status is 7 bits at bottom, either 0 (exited),
 | 
				
			||||||
 | 
					// 0x7F (stopped), or a signal number that caused an exit.
 | 
				
			||||||
 | 
					// The 0x80 bit is whether there was a core dump.
 | 
				
			||||||
 | 
					// An extra number (exit code, signal causing a stop)
 | 
				
			||||||
 | 
					// is in the high bits.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WaitStatus uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						mask  = 0x7F
 | 
				
			||||||
 | 
						core  = 0x80
 | 
				
			||||||
 | 
						shift = 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exited  = 0
 | 
				
			||||||
 | 
						stopped = 0x7F
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Exited() bool { return w&mask == exited }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) ExitStatus() int {
 | 
				
			||||||
 | 
						if w&mask != exited {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(w >> shift)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Signal() syscall.Signal {
 | 
				
			||||||
 | 
						sig := syscall.Signal(w & mask)
 | 
				
			||||||
 | 
						if sig == stopped || sig == 0 {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sig
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) StopSignal() syscall.Signal {
 | 
				
			||||||
 | 
						if !w.Stopped() {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return syscall.Signal(w>>shift) & 0xFF
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) TrapCause() int { return -1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
 | 
				
			||||||
 | 
						var status _C_int
 | 
				
			||||||
 | 
						wpid, err = wait4(pid, &status, options, rusage)
 | 
				
			||||||
 | 
						if wstatus != nil {
 | 
				
			||||||
 | 
							*wstatus = WaitStatus(status)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(s int, how int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						if sa.Port < 0 || sa.Port > 0xFFFF {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Len = SizeofSockaddrInet4
 | 
				
			||||||
 | 
						sa.raw.Family = AF_INET
 | 
				
			||||||
 | 
						p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 | 
				
			||||||
 | 
						p[0] = byte(sa.Port >> 8)
 | 
				
			||||||
 | 
						p[1] = byte(sa.Port)
 | 
				
			||||||
 | 
						for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
							sa.raw.Addr[i] = sa.Addr[i]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						if sa.Port < 0 || sa.Port > 0xFFFF {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Len = SizeofSockaddrInet6
 | 
				
			||||||
 | 
						sa.raw.Family = AF_INET6
 | 
				
			||||||
 | 
						p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 | 
				
			||||||
 | 
						p[0] = byte(sa.Port >> 8)
 | 
				
			||||||
 | 
						p[1] = byte(sa.Port)
 | 
				
			||||||
 | 
						sa.raw.Scope_id = sa.ZoneId
 | 
				
			||||||
 | 
						for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
							sa.raw.Addr[i] = sa.Addr[i]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						name := sa.Name
 | 
				
			||||||
 | 
						n := len(name)
 | 
				
			||||||
 | 
						if n >= len(sa.raw.Path) || n == 0 {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
 | 
				
			||||||
 | 
						sa.raw.Family = AF_UNIX
 | 
				
			||||||
 | 
						for i := 0; i < n; i++ {
 | 
				
			||||||
 | 
							sa.raw.Path[i] = int8(name[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						if sa.Index == 0 {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Len = sa.Len
 | 
				
			||||||
 | 
						sa.raw.Family = AF_LINK
 | 
				
			||||||
 | 
						sa.raw.Index = sa.Index
 | 
				
			||||||
 | 
						sa.raw.Type = sa.Type
 | 
				
			||||||
 | 
						sa.raw.Nlen = sa.Nlen
 | 
				
			||||||
 | 
						sa.raw.Alen = sa.Alen
 | 
				
			||||||
 | 
						sa.raw.Slen = sa.Slen
 | 
				
			||||||
 | 
						for i := 0; i < len(sa.raw.Data); i++ {
 | 
				
			||||||
 | 
							sa.raw.Data[i] = sa.Data[i]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
 | 
				
			||||||
 | 
						switch rsa.Addr.Family {
 | 
				
			||||||
 | 
						case AF_LINK:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrDatalink)
 | 
				
			||||||
 | 
							sa.Len = pp.Len
 | 
				
			||||||
 | 
							sa.Family = pp.Family
 | 
				
			||||||
 | 
							sa.Index = pp.Index
 | 
				
			||||||
 | 
							sa.Type = pp.Type
 | 
				
			||||||
 | 
							sa.Nlen = pp.Nlen
 | 
				
			||||||
 | 
							sa.Alen = pp.Alen
 | 
				
			||||||
 | 
							sa.Slen = pp.Slen
 | 
				
			||||||
 | 
							for i := 0; i < len(sa.Data); i++ {
 | 
				
			||||||
 | 
								sa.Data[i] = pp.Data[i]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case AF_UNIX:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
 | 
				
			||||||
 | 
								return nil, EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							sa := new(SockaddrUnix)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Some BSDs include the trailing NUL in the length, whereas
 | 
				
			||||||
 | 
							// others do not. Work around this by subtracting the leading
 | 
				
			||||||
 | 
							// family and len. The path is then scanned to see if a NUL
 | 
				
			||||||
 | 
							// terminator still exists within the length.
 | 
				
			||||||
 | 
							n := int(pp.Len) - 2 // subtract leading Family, Len
 | 
				
			||||||
 | 
							for i := 0; i < n; i++ {
 | 
				
			||||||
 | 
								if pp.Path[i] == 0 {
 | 
				
			||||||
 | 
									// found early NUL; assume Len included the NUL
 | 
				
			||||||
 | 
									// or was overestimating.
 | 
				
			||||||
 | 
									n = i
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
 | 
				
			||||||
 | 
							sa.Name = string(bytes)
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case AF_INET:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrInet4)
 | 
				
			||||||
 | 
							p := (*[2]byte)(unsafe.Pointer(&pp.Port))
 | 
				
			||||||
 | 
							sa.Port = int(p[0])<<8 + int(p[1])
 | 
				
			||||||
 | 
							for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
								sa.Addr[i] = pp.Addr[i]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case AF_INET6:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrInet6)
 | 
				
			||||||
 | 
							p := (*[2]byte)(unsafe.Pointer(&pp.Port))
 | 
				
			||||||
 | 
							sa.Port = int(p[0])<<8 + int(p[1])
 | 
				
			||||||
 | 
							sa.ZoneId = pp.Scope_id
 | 
				
			||||||
 | 
							for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
								sa.Addr[i] = pp.Addr[i]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, EAFNOSUPPORT
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Accept(fd int) (nfd int, sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						nfd, err = accept(fd, &rsa, &len)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if runtime.GOOS == "darwin" && len == 0 {
 | 
				
			||||||
 | 
							// Accepted socket has no address.
 | 
				
			||||||
 | 
							// This is likely due to a bug in xnu kernels,
 | 
				
			||||||
 | 
							// where instead of ECONNABORTED error socket
 | 
				
			||||||
 | 
							// is accepted, but has no address.
 | 
				
			||||||
 | 
							Close(nfd)
 | 
				
			||||||
 | 
							return 0, nil, ECONNABORTED
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Close(nfd)
 | 
				
			||||||
 | 
							nfd = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getsockname(fd int) (sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						if err = getsockname(fd, &rsa, &len); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be
 | 
				
			||||||
 | 
						// reported upstream.
 | 
				
			||||||
 | 
						if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
 | 
				
			||||||
 | 
							rsa.Addr.Family = AF_UNIX
 | 
				
			||||||
 | 
							rsa.Addr.Len = SizeofSockaddrUnix
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptByte(fd, level, opt int) (value byte, err error) {
 | 
				
			||||||
 | 
						var n byte
 | 
				
			||||||
 | 
						vallen := _Socklen(1)
 | 
				
			||||||
 | 
						err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
 | 
				
			||||||
 | 
						return n, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
 | 
				
			||||||
 | 
						vallen := _Socklen(4)
 | 
				
			||||||
 | 
						err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)
 | 
				
			||||||
 | 
						return value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
 | 
				
			||||||
 | 
						var value IPMreq
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofIPMreq)
 | 
				
			||||||
 | 
						err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
 | 
				
			||||||
 | 
						var value IPv6Mreq
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofIPv6Mreq)
 | 
				
			||||||
 | 
						err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
 | 
				
			||||||
 | 
						var value IPv6MTUInfo
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofIPv6MTUInfo)
 | 
				
			||||||
 | 
						err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {
 | 
				
			||||||
 | 
						var value ICMPv6Filter
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofICMPv6Filter)
 | 
				
			||||||
 | 
						err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys   recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys   sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 | 
				
			||||||
 | 
						var msg Msghdr
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						msg.Name = (*byte)(unsafe.Pointer(&rsa))
 | 
				
			||||||
 | 
						msg.Namelen = uint32(SizeofSockaddrAny)
 | 
				
			||||||
 | 
						var iov Iovec
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
							iov.SetLen(len(p))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var dummy byte
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
 | 
							// receive at least one normal byte
 | 
				
			||||||
 | 
							if len(p) == 0 {
 | 
				
			||||||
 | 
								iov.Base = &dummy
 | 
				
			||||||
 | 
								iov.SetLen(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						msg.Iov = &iov
 | 
				
			||||||
 | 
						msg.Iovlen = 1
 | 
				
			||||||
 | 
						if n, err = recvmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						oobn = int(msg.Controllen)
 | 
				
			||||||
 | 
						recvflags = int(msg.Flags)
 | 
				
			||||||
 | 
						// source address is only specified if the socket is unconnected
 | 
				
			||||||
 | 
						if rsa.Addr.Family != AF_UNSPEC {
 | 
				
			||||||
 | 
							from, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 | 
				
			||||||
 | 
						_, err = SendmsgN(fd, p, oob, to, flags)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 | 
				
			||||||
 | 
						var ptr unsafe.Pointer
 | 
				
			||||||
 | 
						var salen _Socklen
 | 
				
			||||||
 | 
						if to != nil {
 | 
				
			||||||
 | 
							ptr, salen, err = to.sockaddr()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 0, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var msg Msghdr
 | 
				
			||||||
 | 
						msg.Name = (*byte)(unsafe.Pointer(ptr))
 | 
				
			||||||
 | 
						msg.Namelen = uint32(salen)
 | 
				
			||||||
 | 
						var iov Iovec
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							iov.Base = (*byte)(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
							iov.SetLen(len(p))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var dummy byte
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
 | 
							// send at least one normal byte
 | 
				
			||||||
 | 
							if len(p) == 0 {
 | 
				
			||||||
 | 
								iov.Base = &dummy
 | 
				
			||||||
 | 
								iov.SetLen(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
							msg.SetControllen(len(oob))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						msg.Iov = &iov
 | 
				
			||||||
 | 
						msg.Iovlen = 1
 | 
				
			||||||
 | 
						if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(oob) > 0 && len(p) == 0 {
 | 
				
			||||||
 | 
							n = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return n, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) {
 | 
				
			||||||
 | 
						var change, event unsafe.Pointer
 | 
				
			||||||
 | 
						if len(changes) > 0 {
 | 
				
			||||||
 | 
							change = unsafe.Pointer(&changes[0])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(events) > 0 {
 | 
				
			||||||
 | 
							event = unsafe.Pointer(&events[0])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return kevent(kq, change, len(changes), event, len(events), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// sysctlmib translates name to mib number and appends any additional args.
 | 
				
			||||||
 | 
					func sysctlmib(name string, args ...int) ([]_C_int, error) {
 | 
				
			||||||
 | 
						// Translate name to mib number.
 | 
				
			||||||
 | 
						mib, err := nametomib(name)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, a := range args {
 | 
				
			||||||
 | 
							mib = append(mib, _C_int(a))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mib, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Sysctl(name string) (string, error) {
 | 
				
			||||||
 | 
						return SysctlArgs(name)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlArgs(name string, args ...int) (string, error) {
 | 
				
			||||||
 | 
						buf, err := SysctlRaw(name, args...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n := len(buf)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Throw away terminating NUL.
 | 
				
			||||||
 | 
						if n > 0 && buf[n-1] == '\x00' {
 | 
				
			||||||
 | 
							n--
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(buf[0:n]), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlUint32(name string) (uint32, error) {
 | 
				
			||||||
 | 
						return SysctlUint32Args(name)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlUint32Args(name string, args ...int) (uint32, error) {
 | 
				
			||||||
 | 
						mib, err := sysctlmib(name, args...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n := uintptr(4)
 | 
				
			||||||
 | 
						buf := make([]byte, 4)
 | 
				
			||||||
 | 
						if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n != 4 {
 | 
				
			||||||
 | 
							return 0, EIO
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *(*uint32)(unsafe.Pointer(&buf[0])), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlUint64(name string, args ...int) (uint64, error) {
 | 
				
			||||||
 | 
						mib, err := sysctlmib(name, args...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						n := uintptr(8)
 | 
				
			||||||
 | 
						buf := make([]byte, 8)
 | 
				
			||||||
 | 
						if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n != 8 {
 | 
				
			||||||
 | 
							return 0, EIO
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return *(*uint64)(unsafe.Pointer(&buf[0])), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SysctlRaw(name string, args ...int) ([]byte, error) {
 | 
				
			||||||
 | 
						mib, err := sysctlmib(name, args...)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find size.
 | 
				
			||||||
 | 
						n := uintptr(0)
 | 
				
			||||||
 | 
						if err := sysctl(mib, nil, &n, nil, 0); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if n == 0 {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Read into buffer of that size.
 | 
				
			||||||
 | 
						buf := make([]byte, n)
 | 
				
			||||||
 | 
						if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// The actual call may return less than the original reported required
 | 
				
			||||||
 | 
						// size so ensure we deal with that.
 | 
				
			||||||
 | 
						return buf[:n], nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	utimes(path string, timeval *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Utimes(path string, tv []Timeval) error {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return utimes(path, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tv) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UtimesNano(path string, ts []Timespec) error {
 | 
				
			||||||
 | 
						if ts == nil {
 | 
				
			||||||
 | 
							return utimes(path, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// TODO: The BSDs can do utimensat with SYS_UTIMENSAT but it
 | 
				
			||||||
 | 
						// isn't supported by darwin so this uses utimes instead
 | 
				
			||||||
 | 
						if len(ts) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// Not as efficient as it could be because Timespec and
 | 
				
			||||||
 | 
						// Timeval have different types in the different OSes
 | 
				
			||||||
 | 
						tv := [2]Timeval{
 | 
				
			||||||
 | 
							NsecToTimeval(TimespecToNsec(ts[0])),
 | 
				
			||||||
 | 
							NsecToTimeval(TimespecToNsec(ts[1])),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	futimes(fd int, timeval *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Futimes(fd int, tv []Timeval) error {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return futimes(fd, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tv) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: wrap
 | 
				
			||||||
 | 
					//	Acct(name nil-string) (err error)
 | 
				
			||||||
 | 
					//	Gethostuuid(uuid *byte, timeout *Timespec) (err error)
 | 
				
			||||||
 | 
					//	Madvise(addr *byte, len int, behav int) (err error)
 | 
				
			||||||
 | 
					//	Mprotect(addr *byte, len int, prot int) (err error)
 | 
				
			||||||
 | 
					//	Msync(addr *byte, len int, flags int) (err error)
 | 
				
			||||||
 | 
					//	Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var mapper = &mmapper{
 | 
				
			||||||
 | 
						active: make(map[*byte][]byte),
 | 
				
			||||||
 | 
						mmap:   mmap,
 | 
				
			||||||
 | 
						munmap: munmap,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
 | 
				
			||||||
 | 
						return mapper.Mmap(fd, offset, length, prot, flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Munmap(b []byte) (err error) {
 | 
				
			||||||
 | 
						return mapper.Munmap(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,493 @@
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Darwin 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 unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						errorspkg "errors"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ImplementsGetwd = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getwd() (string, error) {
 | 
				
			||||||
 | 
						buf := make([]byte, 2048)
 | 
				
			||||||
 | 
						attrs, err := getAttrList(".", attrList{CommonAttr: attrCmnFullpath}, buf, 0)
 | 
				
			||||||
 | 
						if err == nil && len(attrs) == 1 && len(attrs[0]) >= 2 {
 | 
				
			||||||
 | 
							wd := string(attrs[0])
 | 
				
			||||||
 | 
							// Sanity check that it's an absolute path and ends
 | 
				
			||||||
 | 
							// in a null byte, which we then strip.
 | 
				
			||||||
 | 
							if wd[0] == '/' && wd[len(wd)-1] == 0 {
 | 
				
			||||||
 | 
								return wd[:len(wd)-1], nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// If pkg/os/getwd.go gets ENOTSUP, it will fall back to the
 | 
				
			||||||
 | 
						// slow algorithm.
 | 
				
			||||||
 | 
						return "", ENOTSUP
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
 | 
						Len    uint8
 | 
				
			||||||
 | 
						Family uint8
 | 
				
			||||||
 | 
						Index  uint16
 | 
				
			||||||
 | 
						Type   uint8
 | 
				
			||||||
 | 
						Nlen   uint8
 | 
				
			||||||
 | 
						Alen   uint8
 | 
				
			||||||
 | 
						Slen   uint8
 | 
				
			||||||
 | 
						Data   [12]int8
 | 
				
			||||||
 | 
						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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys   ptrace(request int, pid int, addr uintptr, data uintptr) (err error)
 | 
				
			||||||
 | 
					func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
 | 
				
			||||||
 | 
					func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						attrBitMapCount = 5
 | 
				
			||||||
 | 
						attrCmnFullpath = 0x08000000
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type attrList struct {
 | 
				
			||||||
 | 
						bitmapCount uint16
 | 
				
			||||||
 | 
						_           uint16
 | 
				
			||||||
 | 
						CommonAttr  uint32
 | 
				
			||||||
 | 
						VolAttr     uint32
 | 
				
			||||||
 | 
						DirAttr     uint32
 | 
				
			||||||
 | 
						FileAttr    uint32
 | 
				
			||||||
 | 
						Forkattr    uint32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getAttrList(path string, attrList attrList, attrBuf []byte, options uint) (attrs [][]byte, err error) {
 | 
				
			||||||
 | 
						if len(attrBuf) < 4 {
 | 
				
			||||||
 | 
							return nil, errorspkg.New("attrBuf too small")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						attrList.bitmapCount = attrBitMapCount
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						var _p0 *byte
 | 
				
			||||||
 | 
						_p0, err = BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, _, e1 := Syscall6(
 | 
				
			||||||
 | 
							SYS_GETATTRLIST,
 | 
				
			||||||
 | 
							uintptr(unsafe.Pointer(_p0)),
 | 
				
			||||||
 | 
							uintptr(unsafe.Pointer(&attrList)),
 | 
				
			||||||
 | 
							uintptr(unsafe.Pointer(&attrBuf[0])),
 | 
				
			||||||
 | 
							uintptr(len(attrBuf)),
 | 
				
			||||||
 | 
							uintptr(options),
 | 
				
			||||||
 | 
							0,
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							return nil, e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						size := *(*uint32)(unsafe.Pointer(&attrBuf[0]))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// dat is the section of attrBuf that contains valid data,
 | 
				
			||||||
 | 
						// without the 4 byte length header. All attribute offsets
 | 
				
			||||||
 | 
						// are relative to dat.
 | 
				
			||||||
 | 
						dat := attrBuf
 | 
				
			||||||
 | 
						if int(size) < len(attrBuf) {
 | 
				
			||||||
 | 
							dat = dat[:size]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						dat = dat[4:] // remove length prefix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for i := uint32(0); int(i) < len(dat); {
 | 
				
			||||||
 | 
							header := dat[i:]
 | 
				
			||||||
 | 
							if len(header) < 8 {
 | 
				
			||||||
 | 
								return attrs, errorspkg.New("truncated attribute header")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							datOff := *(*int32)(unsafe.Pointer(&header[0]))
 | 
				
			||||||
 | 
							attrLen := *(*uint32)(unsafe.Pointer(&header[4]))
 | 
				
			||||||
 | 
							if datOff < 0 || uint32(datOff)+attrLen > uint32(len(dat)) {
 | 
				
			||||||
 | 
								return attrs, errorspkg.New("truncated results; attrBuf too small")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							end := uint32(datOff) + attrLen
 | 
				
			||||||
 | 
							attrs = append(attrs, dat[datOff:end])
 | 
				
			||||||
 | 
							i = end
 | 
				
			||||||
 | 
							if r := i % 4; r != 0 {
 | 
				
			||||||
 | 
								i += (4 - r)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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_GETFSSTAT64, uintptr(_p0), bufsize, uintptr(flags))
 | 
				
			||||||
 | 
						n = int(r0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Wrapped
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	kill(pid int, signum int, posix int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Kill(pid int, signum syscall.Signal) (err error) { return kill(pid, int(signum), 1) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
 | 
					//sys	Exchangedata(path1 string, path2 string, options 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_FSTAT64
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, stat *Statfs_t) (err error) = SYS_FSTATFS64
 | 
				
			||||||
 | 
					//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_GETDIRENTRIES64
 | 
				
			||||||
 | 
					//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	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sysnb	Issetugid() (tainted bool)
 | 
				
			||||||
 | 
					//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_LSTAT64
 | 
				
			||||||
 | 
					//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	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (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	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n 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)
 | 
				
			||||||
 | 
					//sys	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)
 | 
				
			||||||
 | 
					//sys	Setprivexec(flag 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_STAT64
 | 
				
			||||||
 | 
					//sys	Statfs(path string, stat *Statfs_t) (err error) = SYS_STATFS64
 | 
				
			||||||
 | 
					//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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					// sendfile
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,77 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build 386,darwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
 | 
				
			||||||
 | 
					func Gettimeofday(tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						// The tv passed to gettimeofday must be non-nil
 | 
				
			||||||
 | 
						// but is otherwise unused.  The answers come back
 | 
				
			||||||
 | 
						// in the two registers.
 | 
				
			||||||
 | 
						sec, usec, err := gettimeofday(tv)
 | 
				
			||||||
 | 
						tv.Sec = int32(sec)
 | 
				
			||||||
 | 
						tv.Usec = int32(usec)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var length = uint64(count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(length)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
 | 
				
			||||||
 | 
					// of darwin/386 the syscall is called sysctl instead of __sysctl.
 | 
				
			||||||
 | 
					const SYS___SYSCTL = SYS_SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,darwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
 | 
				
			||||||
 | 
					func Gettimeofday(tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						// The tv passed to gettimeofday must be non-nil
 | 
				
			||||||
 | 
						// but is otherwise unused.  The answers come back
 | 
				
			||||||
 | 
						// in the two registers.
 | 
				
			||||||
 | 
						sec, usec, err := gettimeofday(tv)
 | 
				
			||||||
 | 
						tv.Sec = sec
 | 
				
			||||||
 | 
						tv.Usec = usec
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var length = uint64(count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(length)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
 | 
				
			||||||
 | 
					// of darwin/amd64 the syscall is called sysctl instead of __sysctl.
 | 
				
			||||||
 | 
					const SYS___SYSCTL = SYS_SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,71 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	gettimeofday(tp *Timeval) (sec int32, usec int32, err error)
 | 
				
			||||||
 | 
					func Gettimeofday(tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						// The tv passed to gettimeofday must be non-nil
 | 
				
			||||||
 | 
						// but is otherwise unused.  The answers come back
 | 
				
			||||||
 | 
						// in the two registers.
 | 
				
			||||||
 | 
						sec, usec, err := gettimeofday(tv)
 | 
				
			||||||
 | 
						tv.Sec = int32(sec)
 | 
				
			||||||
 | 
						tv.Usec = int32(usec)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var length = uint64(count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(*offset>>32), uintptr(unsafe.Pointer(&length)), 0, 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(length)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,77 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build arm64,darwin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 16384 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	gettimeofday(tp *Timeval) (sec int64, usec int32, err error)
 | 
				
			||||||
 | 
					func Gettimeofday(tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						// The tv passed to gettimeofday must be non-nil
 | 
				
			||||||
 | 
						// but is otherwise unused.  The answers come back
 | 
				
			||||||
 | 
						// in the two registers.
 | 
				
			||||||
 | 
						sec, usec, err := gettimeofday(tv)
 | 
				
			||||||
 | 
						tv.Sec = sec
 | 
				
			||||||
 | 
						tv.Usec = usec
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var length = uint64(count)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, _, e1 := Syscall6(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(unsafe.Pointer(&length)), 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(length)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno) // sic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// SYS___SYSCTL is used by syscall_bsd.go for all BSDs, but in modern versions
 | 
				
			||||||
 | 
					// of darwin/arm64 the syscall is called sysctl instead of __sysctl.
 | 
				
			||||||
 | 
					const SYS___SYSCTL = SYS_SYSCTL
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,402 @@
 | 
				
			||||||
 | 
					// 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 unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						namlen, ok := direntNamlen(buf)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return 0, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return (16 + namlen + 1 + 7) & ^7, true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//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)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	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 syscall.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	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (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	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid 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
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
 | 
					// __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
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,dragonfly
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var writtenOut uint64 = 0
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(writtenOut)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,666 @@
 | 
				
			||||||
 | 
					// 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 unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "unsafe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
 | 
						Len    uint8
 | 
				
			||||||
 | 
						Family uint8
 | 
				
			||||||
 | 
						Index  uint16
 | 
				
			||||||
 | 
						Type   uint8
 | 
				
			||||||
 | 
						Nlen   uint8
 | 
				
			||||||
 | 
						Alen   uint8
 | 
				
			||||||
 | 
						Slen   uint8
 | 
				
			||||||
 | 
						Data   [46]int8
 | 
				
			||||||
 | 
						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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptIPMreqn(fd, level, opt int) (*IPMreqn, error) {
 | 
				
			||||||
 | 
						var value IPMreqn
 | 
				
			||||||
 | 
						vallen := _Socklen(SizeofIPMreqn)
 | 
				
			||||||
 | 
						errno := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
 | 
				
			||||||
 | 
						return &value, errno
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptIPMreqn(fd, level, opt int, mreq *IPMreqn) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(mreq), unsafe.Sizeof(*mreq))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Accept4(fd, flags int) (nfd int, sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						nfd, err = accept4(fd, &rsa, &len, flags)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len > SizeofSockaddrAny {
 | 
				
			||||||
 | 
							panic("RawSockaddrAny too small")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Close(nfd)
 | 
				
			||||||
 | 
							nfd = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Derive extattr namespace and attribute name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func xattrnamespace(fullattr string) (ns int, attr string, err error) {
 | 
				
			||||||
 | 
						s := -1
 | 
				
			||||||
 | 
						for idx, val := range fullattr {
 | 
				
			||||||
 | 
							if val == '.' {
 | 
				
			||||||
 | 
								s = idx
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s == -1 {
 | 
				
			||||||
 | 
							return -1, "", ENOATTR
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						namespace := fullattr[0:s]
 | 
				
			||||||
 | 
						attr = fullattr[s+1:]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch namespace {
 | 
				
			||||||
 | 
						case "user":
 | 
				
			||||||
 | 
							return EXTATTR_NAMESPACE_USER, attr, nil
 | 
				
			||||||
 | 
						case "system":
 | 
				
			||||||
 | 
							return EXTATTR_NAMESPACE_SYSTEM, attr, nil
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return -1, "", ENOATTR
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func initxattrdest(dest []byte, idx int) (d unsafe.Pointer) {
 | 
				
			||||||
 | 
						if len(dest) > idx {
 | 
				
			||||||
 | 
							return unsafe.Pointer(&dest[idx])
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return unsafe.Pointer(_zero)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FreeBSD implements its own syscalls to handle extended attributes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getxattr(file string, attr string, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsize := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return -1, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ExtattrGetFile(file, nsid, a, uintptr(d), destsize)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsize := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return -1, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ExtattrGetFd(fd, nsid, a, uintptr(d), destsize)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lgetxattr(link string, attr string, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsize := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return -1, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ExtattrGetLink(link, nsid, a, uintptr(d), destsize)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// flags are unused on FreeBSD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fsetxattr(fd int, attr string, data []byte, flags int) (err error) {
 | 
				
			||||||
 | 
						d := unsafe.Pointer(&data[0])
 | 
				
			||||||
 | 
						datasiz := len(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = ExtattrSetFd(fd, nsid, a, uintptr(d), datasiz)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setxattr(file string, attr string, data []byte, flags int) (err error) {
 | 
				
			||||||
 | 
						d := unsafe.Pointer(&data[0])
 | 
				
			||||||
 | 
						datasiz := len(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = ExtattrSetFile(file, nsid, a, uintptr(d), datasiz)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lsetxattr(link string, attr string, data []byte, flags int) (err error) {
 | 
				
			||||||
 | 
						d := unsafe.Pointer(&data[0])
 | 
				
			||||||
 | 
						datasiz := len(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = ExtattrSetLink(link, nsid, a, uintptr(d), datasiz)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Removexattr(file string, attr string) (err error) {
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = ExtattrDeleteFile(file, nsid, a)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fremovexattr(fd int, attr string) (err error) {
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = ExtattrDeleteFd(fd, nsid, a)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lremovexattr(link string, attr string) (err error) {
 | 
				
			||||||
 | 
						nsid, a, err := xattrnamespace(attr)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = ExtattrDeleteLink(link, nsid, a)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Listxattr(file string, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsiz := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// FreeBSD won't allow you to list xattrs from multiple namespaces
 | 
				
			||||||
 | 
						s := 0
 | 
				
			||||||
 | 
						var e error
 | 
				
			||||||
 | 
						for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
				
			||||||
 | 
							stmp, e := ExtattrListFile(file, nsid, uintptr(d), destsiz)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Errors accessing system attrs are ignored so that
 | 
				
			||||||
 | 
							 * we can implement the Linux-like behavior of omitting errors that
 | 
				
			||||||
 | 
							 * we don't have read permissions on
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 * Linux will still error if we ask for user attributes on a file that
 | 
				
			||||||
 | 
							 * we don't have read permissions on, so don't ignore those errors
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
				
			||||||
 | 
								e = nil
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							} else if e != nil {
 | 
				
			||||||
 | 
								return s, e
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s += stmp
 | 
				
			||||||
 | 
							destsiz -= s
 | 
				
			||||||
 | 
							if destsiz < 0 {
 | 
				
			||||||
 | 
								destsiz = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							d = initxattrdest(dest, s)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return s, e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Flistxattr(fd int, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsiz := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s := 0
 | 
				
			||||||
 | 
						var e error
 | 
				
			||||||
 | 
						for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
				
			||||||
 | 
							stmp, e := ExtattrListFd(fd, nsid, uintptr(d), destsiz)
 | 
				
			||||||
 | 
							if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
				
			||||||
 | 
								e = nil
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							} else if e != nil {
 | 
				
			||||||
 | 
								return s, e
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s += stmp
 | 
				
			||||||
 | 
							destsiz -= s
 | 
				
			||||||
 | 
							if destsiz < 0 {
 | 
				
			||||||
 | 
								destsiz = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							d = initxattrdest(dest, s)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return s, e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Llistxattr(link string, dest []byte) (sz int, err error) {
 | 
				
			||||||
 | 
						d := initxattrdest(dest, 0)
 | 
				
			||||||
 | 
						destsiz := len(dest)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s := 0
 | 
				
			||||||
 | 
						var e error
 | 
				
			||||||
 | 
						for _, nsid := range [...]int{EXTATTR_NAMESPACE_USER, EXTATTR_NAMESPACE_SYSTEM} {
 | 
				
			||||||
 | 
							stmp, e := ExtattrListLink(link, nsid, uintptr(d), destsiz)
 | 
				
			||||||
 | 
							if e != nil && e == EPERM && nsid != EXTATTR_NAMESPACE_USER {
 | 
				
			||||||
 | 
								e = nil
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							} else if e != nil {
 | 
				
			||||||
 | 
								return s, e
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							s += stmp
 | 
				
			||||||
 | 
							destsiz -= s
 | 
				
			||||||
 | 
							if destsiz < 0 {
 | 
				
			||||||
 | 
								destsiz = 0
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							d = initxattrdest(dest, s)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return s, e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	Dup2(from int, to int) (err error)
 | 
				
			||||||
 | 
					//sys	Exit(code int)
 | 
				
			||||||
 | 
					//sys	ExtattrGetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrSetFd(fd int, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrDeleteFd(fd int, attrnamespace int, attrname string) (err error)
 | 
				
			||||||
 | 
					//sys	ExtattrListFd(fd int, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrGetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrSetFile(file string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrDeleteFile(file string, attrnamespace int, attrname string) (err error)
 | 
				
			||||||
 | 
					//sys	ExtattrListFile(file string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrGetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrSetLink(link string, attrnamespace int, attrname string, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	ExtattrDeleteLink(link string, attrnamespace int, attrname string) (err error)
 | 
				
			||||||
 | 
					//sys	ExtattrListLink(link string, attrnamespace int, data uintptr, nbytes int) (ret int, err error)
 | 
				
			||||||
 | 
					//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_POSIX_FADVISE
 | 
				
			||||||
 | 
					//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 syscall.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	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (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	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n 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	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid 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
 | 
				
			||||||
 | 
					//sys	accept4(fd int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (nfd int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Unimplemented
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// 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
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build 386,freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var writtenOut uint64 = 0
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(writtenOut)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var writtenOut uint64 = 0
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(writtenOut)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,61 @@
 | 
				
			||||||
 | 
					// Copyright 2012 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build arm,freebsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return ts.Sec*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						var writtenOut uint64 = 0
 | 
				
			||||||
 | 
						_, _, e1 := Syscall9(SYS_SENDFILE, uintptr(infd), uintptr(outfd), uintptr(*offset), uintptr((*offset)>>32), uintptr(count), 0, uintptr(unsafe.Pointer(&writtenOut)), 0, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						written = int(writtenOut)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(num, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,399 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO(rsc): Rewrite all nn(SP) references into name+(nn-8)(FP)
 | 
				
			||||||
 | 
					// so that go vet can check that they are correct.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build 386,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	pipe(p *[2]_C_int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe(&pp)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 64-bit file system and 32-bit uid calls
 | 
				
			||||||
 | 
					// (386 default is 32-bit file system and 16-bit uid).
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64_64
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int) = SYS_GETEGID32
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int) = SYS_GETEUID32
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int) = SYS_GETGID32
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int) = SYS_GETUID32
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Ioperm(from int, num int, on int) (err error)
 | 
				
			||||||
 | 
					//sys	Iopl(level int) (err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
 | 
				
			||||||
 | 
						page := uintptr(offset / 4096)
 | 
				
			||||||
 | 
						if offset != int64(page)*4096 {
 | 
				
			||||||
 | 
							return 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mmap2(addr, length, prot, flags, fd, page)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type rlimit32 struct {
 | 
				
			||||||
 | 
						Cur uint32
 | 
				
			||||||
 | 
						Max uint32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rlimInf32 = ^uint32(0)
 | 
				
			||||||
 | 
					const rlimInf64 = ^uint64(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, nil, rlim)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						err = getrlimit(resource, &rl)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Cur == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Cur = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Cur = uint64(rl.Cur)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Max == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Max = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Max = uint64(rl.Max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, rlim, nil)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						if rlim.Cur == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Cur = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Cur < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Cur = uint32(rlim.Cur)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rlim.Max == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Max = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Max < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Max = uint32(rlim.Max)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return setrlimit(resource, &rl)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Underlying system call writes to newoffset via pointer.
 | 
				
			||||||
 | 
					// Implemented in assembly to avoid allocation.
 | 
				
			||||||
 | 
					func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 | 
				
			||||||
 | 
						newoffset, errno := seek(fd, offset, whence)
 | 
				
			||||||
 | 
						if errno != 0 {
 | 
				
			||||||
 | 
							return 0, errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return newoffset, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Vsyscalls on amd64.
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					//sysnb	Time(t *Time_t) (tt Time_t, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// On x86 Linux, all the socket calls go through an extra indirection,
 | 
				
			||||||
 | 
					// I think because the 5-register system call interface can't handle
 | 
				
			||||||
 | 
					// the 6-argument calls like sendto and recvfrom.  Instead the
 | 
				
			||||||
 | 
					// arguments to the underlying system call are the number below
 | 
				
			||||||
 | 
					// and a pointer to an array of uintptr.  We hide the pointer in the
 | 
				
			||||||
 | 
					// socketcall assembly to avoid allocation on every system call.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// see linux/net.h
 | 
				
			||||||
 | 
						_SOCKET      = 1
 | 
				
			||||||
 | 
						_BIND        = 2
 | 
				
			||||||
 | 
						_CONNECT     = 3
 | 
				
			||||||
 | 
						_LISTEN      = 4
 | 
				
			||||||
 | 
						_ACCEPT      = 5
 | 
				
			||||||
 | 
						_GETSOCKNAME = 6
 | 
				
			||||||
 | 
						_GETPEERNAME = 7
 | 
				
			||||||
 | 
						_SOCKETPAIR  = 8
 | 
				
			||||||
 | 
						_SEND        = 9
 | 
				
			||||||
 | 
						_RECV        = 10
 | 
				
			||||||
 | 
						_SENDTO      = 11
 | 
				
			||||||
 | 
						_RECVFROM    = 12
 | 
				
			||||||
 | 
						_SHUTDOWN    = 13
 | 
				
			||||||
 | 
						_SETSOCKOPT  = 14
 | 
				
			||||||
 | 
						_GETSOCKOPT  = 15
 | 
				
			||||||
 | 
						_SENDMSG     = 16
 | 
				
			||||||
 | 
						_RECVMSG     = 17
 | 
				
			||||||
 | 
						_ACCEPT4     = 18
 | 
				
			||||||
 | 
						_RECVMMSG    = 19
 | 
				
			||||||
 | 
						_SENDMMSG    = 20
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno)
 | 
				
			||||||
 | 
					func rawsocketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (n int, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) {
 | 
				
			||||||
 | 
						fd, e := socketcall(_ACCEPT, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) {
 | 
				
			||||||
 | 
						fd, e := socketcall(_ACCEPT4, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags), 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
 | 
				
			||||||
 | 
						_, e := rawsocketcall(_GETSOCKNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) {
 | 
				
			||||||
 | 
						_, e := rawsocketcall(_GETPEERNAME, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socketpair(domain int, typ int, flags int, fd *[2]int32) (err error) {
 | 
				
			||||||
 | 
						_, e := rawsocketcall(_SOCKETPAIR, uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd)), 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_BIND, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_CONNECT, uintptr(s), uintptr(addr), uintptr(addrlen), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socket(domain int, typ int, proto int) (fd int, err error) {
 | 
				
			||||||
 | 
						fd, e := rawsocketcall(_SOCKET, uintptr(domain), uintptr(typ), uintptr(proto), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_GETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen)), 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_SETSOCKOPT, uintptr(s), uintptr(level), uintptr(name), uintptr(val), vallen, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) {
 | 
				
			||||||
 | 
						var base uintptr
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							base = uintptr(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n, e := socketcall(_RECVFROM, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) {
 | 
				
			||||||
 | 
						var base uintptr
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							base = uintptr(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, e := socketcall(_SENDTO, uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func recvmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 | 
				
			||||||
 | 
						n, e := socketcall(_RECVMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendmsg(s int, msg *Msghdr, flags int) (n int, err error) {
 | 
				
			||||||
 | 
						n, e := socketcall(_SENDMSG, uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags), 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Listen(s int, n int) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_LISTEN, uintptr(s), uintptr(n), 0, 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Shutdown(s, how int) (err error) {
 | 
				
			||||||
 | 
						_, e := socketcall(_SHUTDOWN, uintptr(s), uintptr(how), 0, 0, 0, 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstatfs(fd int, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Statfs(path string, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						pathp, err := BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return uint64(uint32(r.Eip)) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Eip = int32(pc) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,152 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Ioperm(from int, num int, on int) (err error)
 | 
				
			||||||
 | 
					//sys	Iopl(level int) (err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Gettimeofday(tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						errno := gettimeofday(tv)
 | 
				
			||||||
 | 
						if errno != 0 {
 | 
				
			||||||
 | 
							return errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (tt Time_t, err error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						errno := gettimeofday(&tv)
 | 
				
			||||||
 | 
						if errno != 0 {
 | 
				
			||||||
 | 
							return 0, errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	pipe(p *[2]_C_int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe(&pp)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Rip }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,13 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,linux
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//go:noescape
 | 
				
			||||||
 | 
					func gettimeofday(tv *Timeval) (err syscall.Errno)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,263 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build arm,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, 0)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Underlying system call writes to newoffset via pointer.
 | 
				
			||||||
 | 
					// Implemented in assembly to avoid allocation.
 | 
				
			||||||
 | 
					func seek(fd int, offset int64, whence int) (newoffset int64, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
 | 
				
			||||||
 | 
						newoffset, errno := seek(fd, offset, whence)
 | 
				
			||||||
 | 
						if errno != 0 {
 | 
				
			||||||
 | 
							return 0, errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return newoffset, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error) = SYS_GETGROUPS32
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error) = SYS_SETGROUPS32
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, flags int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// 64-bit file system and 32-bit uid calls
 | 
				
			||||||
 | 
					// (16-bit uid calls are not always supported in newer kernels)
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error) = SYS_FCHOWN32
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int) = SYS_GETEGID32
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int) = SYS_GETEUID32
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int) = SYS_GETGID32
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int) = SYS_GETUID32
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error) = SYS_LCHOWN32
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error) = SYS_SETFSGID32
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error) = SYS_SETFSUID32
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error) = SYS_SETREGID32
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error) = SYS_SETRESGID32
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error) = SYS_SETRESUID32
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error) = SYS_SETREUID32
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Vsyscalls on amd64.
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (Time_t, error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err := Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Utime(path string, buf *Utimbuf) error {
 | 
				
			||||||
 | 
						tv := []Timeval{
 | 
				
			||||||
 | 
							{Sec: buf.Actime},
 | 
				
			||||||
 | 
							{Sec: buf.Modtime},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Utimes(path, tv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys   Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys   Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fadvise(fd int, offset int64, length int64, advice int) (err error) {
 | 
				
			||||||
 | 
						_, _, e1 := Syscall6(SYS_ARM_FADVISE64_64, uintptr(fd), uintptr(advice), uintptr(offset), uintptr(offset>>32), uintptr(length), uintptr(length>>32))
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstatfs(fd int, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Statfs(path string, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						pathp, err := BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(pathp)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = e
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
 | 
				
			||||||
 | 
						page := uintptr(offset / 4096)
 | 
				
			||||||
 | 
						if offset != int64(page)*4096 {
 | 
				
			||||||
 | 
							return 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mmap2(addr, length, prot, flags, fd, page)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type rlimit32 struct {
 | 
				
			||||||
 | 
						Cur uint32
 | 
				
			||||||
 | 
						Max uint32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_UGETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rlimInf32 = ^uint32(0)
 | 
				
			||||||
 | 
					const rlimInf64 = ^uint64(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, nil, rlim)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						err = getrlimit(resource, &rl)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Cur == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Cur = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Cur = uint64(rl.Cur)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Max == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Max = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Max = uint64(rl.Max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, rlim, nil)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						if rlim.Cur == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Cur = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Cur < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Cur = uint32(rlim.Cur)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rlim.Max == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Max = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Max < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Max = uint32(rlim.Max)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return setrlimit(resource, &rl)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,190 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build arm64,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatat(fd int, path string, stat *Stat_t, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Stat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
 | 
						return Fstatat(AT_FDCWD, path, stat, 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lchown(path string, uid int, gid int) (err error) {
 | 
				
			||||||
 | 
						return Fchownat(AT_FDCWD, path, uid, gid, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lstat(path string, stat *Stat_t) (err error) {
 | 
				
			||||||
 | 
						return Fstatat(AT_FDCWD, path, stat, AT_SYMLINK_NOFOLLOW)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 65536 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (Time_t, error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err := Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Utime(path string, buf *Utimbuf) error {
 | 
				
			||||||
 | 
						tv := []Timeval{
 | 
				
			||||||
 | 
							{Sec: buf.Actime},
 | 
				
			||||||
 | 
							{Sec: buf.Modtime},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Utimes(path, tv)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, 0)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func InotifyInit() (fd int, err error) {
 | 
				
			||||||
 | 
						return InotifyInit1(0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Dup2(oldfd int, newfd int) (err error) {
 | 
				
			||||||
 | 
						return Dup3(oldfd, newfd, 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pause() (err error) {
 | 
				
			||||||
 | 
						_, _, e1 := Syscall6(SYS_PPOLL, 0, 0, 0, 0, 0, 0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO(dfc): constants that should be in zsysnum_linux_arm64.go, remove
 | 
				
			||||||
 | 
					// these when the deprecated syscalls that the syscall package relies on
 | 
				
			||||||
 | 
					// are removed.
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SYS_GETPGRP      = 1060
 | 
				
			||||||
 | 
						SYS_UTIMES       = 1037
 | 
				
			||||||
 | 
						SYS_FUTIMESAT    = 1066
 | 
				
			||||||
 | 
						SYS_PAUSE        = 1061
 | 
				
			||||||
 | 
						SYS_USTAT        = 1070
 | 
				
			||||||
 | 
						SYS_UTIME        = 1063
 | 
				
			||||||
 | 
						SYS_LCHOWN       = 1032
 | 
				
			||||||
 | 
						SYS_TIME         = 1062
 | 
				
			||||||
 | 
						SYS_EPOLL_CREATE = 1042
 | 
				
			||||||
 | 
						SYS_EPOLL_WAIT   = 1069
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						var ts *Timespec
 | 
				
			||||||
 | 
						if timeout >= 0 {
 | 
				
			||||||
 | 
							ts = new(Timespec)
 | 
				
			||||||
 | 
							*ts = NsecToTimespec(int64(timeout) * 1e6)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return ppoll(nil, 0, ts, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return ppoll(&fds[0], len(fds), ts, nil)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,208 @@
 | 
				
			||||||
 | 
					// Copyright 2015 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build mips64 mips64le
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS_PSELECT6
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 65536 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (tt Time_t, err error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err = Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, 0)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Ioperm(from int, num int, on int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Iopl(level int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type stat_t struct {
 | 
				
			||||||
 | 
						Dev        uint32
 | 
				
			||||||
 | 
						Pad0       [3]int32
 | 
				
			||||||
 | 
						Ino        uint64
 | 
				
			||||||
 | 
						Mode       uint32
 | 
				
			||||||
 | 
						Nlink      uint32
 | 
				
			||||||
 | 
						Uid        uint32
 | 
				
			||||||
 | 
						Gid        uint32
 | 
				
			||||||
 | 
						Rdev       uint32
 | 
				
			||||||
 | 
						Pad1       [3]uint32
 | 
				
			||||||
 | 
						Size       int64
 | 
				
			||||||
 | 
						Atime      uint32
 | 
				
			||||||
 | 
						Atime_nsec uint32
 | 
				
			||||||
 | 
						Mtime      uint32
 | 
				
			||||||
 | 
						Mtime_nsec uint32
 | 
				
			||||||
 | 
						Ctime      uint32
 | 
				
			||||||
 | 
						Ctime_nsec uint32
 | 
				
			||||||
 | 
						Blksize    uint32
 | 
				
			||||||
 | 
						Pad2       uint32
 | 
				
			||||||
 | 
						Blocks     int64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	fstat(fd int, st *stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	lstat(path string, st *stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	stat(path string, st *stat_t) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstat(fd int, s *Stat_t) (err error) {
 | 
				
			||||||
 | 
						st := &stat_t{}
 | 
				
			||||||
 | 
						err = fstat(fd, st)
 | 
				
			||||||
 | 
						fillStat_t(s, st)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Lstat(path string, s *Stat_t) (err error) {
 | 
				
			||||||
 | 
						st := &stat_t{}
 | 
				
			||||||
 | 
						err = lstat(path, st)
 | 
				
			||||||
 | 
						fillStat_t(s, st)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Stat(path string, s *Stat_t) (err error) {
 | 
				
			||||||
 | 
						st := &stat_t{}
 | 
				
			||||||
 | 
						err = stat(path, st)
 | 
				
			||||||
 | 
						fillStat_t(s, st)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func fillStat_t(s *Stat_t, st *stat_t) {
 | 
				
			||||||
 | 
						s.Dev = st.Dev
 | 
				
			||||||
 | 
						s.Ino = st.Ino
 | 
				
			||||||
 | 
						s.Mode = st.Mode
 | 
				
			||||||
 | 
						s.Nlink = st.Nlink
 | 
				
			||||||
 | 
						s.Uid = st.Uid
 | 
				
			||||||
 | 
						s.Gid = st.Gid
 | 
				
			||||||
 | 
						s.Rdev = st.Rdev
 | 
				
			||||||
 | 
						s.Size = st.Size
 | 
				
			||||||
 | 
						s.Atim = Timespec{int64(st.Atime), int64(st.Atime_nsec)}
 | 
				
			||||||
 | 
						s.Mtim = Timespec{int64(st.Mtime), int64(st.Mtime_nsec)}
 | 
				
			||||||
 | 
						s.Ctim = Timespec{int64(st.Ctime), int64(st.Ctime_nsec)}
 | 
				
			||||||
 | 
						s.Blksize = st.Blksize
 | 
				
			||||||
 | 
						s.Blocks = st.Blocks
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Regs[64] }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,239 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build mips mipsle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error) = SYS_FTRUNCATE64
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error) = SYS__NEWSELECT
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) = SYS_SENDFILE64
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error) = SYS_TRUNCATE64
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Ioperm(from int, num int, on int) (err error)
 | 
				
			||||||
 | 
					//sys	Iopl(level int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					//sysnb	Time(t *Time_t) (tt Time_t, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error) = SYS_LSTAT64
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error) = SYS_FSTAT64
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error) = SYS_STAT64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Fstatfs(fd int, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_FSTATFS64, uintptr(fd), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Statfs(path string, buf *Statfs_t) (err error) {
 | 
				
			||||||
 | 
						p, err := BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, _, e := Syscall(SYS_STATFS64, uintptr(unsafe.Pointer(p)), unsafe.Sizeof(*buf), uintptr(unsafe.Pointer(buf)))
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Seek(fd int, offset int64, whence int) (off int64, err error) {
 | 
				
			||||||
 | 
						_, _, e := Syscall6(SYS__LLSEEK, uintptr(fd), uintptr(offset>>32), uintptr(offset), uintptr(unsafe.Pointer(&off)), uintptr(whence), 0)
 | 
				
			||||||
 | 
						if e != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = int32(nsec / 1e9)
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, 0)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	mmap2(addr uintptr, length uintptr, prot int, flags int, fd int, pageOffset uintptr) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
 | 
				
			||||||
 | 
						page := uintptr(offset / 4096)
 | 
				
			||||||
 | 
						if offset != int64(page)*4096 {
 | 
				
			||||||
 | 
							return 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return mmap2(addr, length, prot, flags, fd, page)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rlimInf32 = ^uint32(0)
 | 
				
			||||||
 | 
					const rlimInf64 = ^uint64(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type rlimit32 struct {
 | 
				
			||||||
 | 
						Cur uint32
 | 
				
			||||||
 | 
						Max uint32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, nil, rlim)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						err = getrlimit(resource, &rl)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Cur == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Cur = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Cur = uint64(rl.Cur)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if rl.Max == rlimInf32 {
 | 
				
			||||||
 | 
							rlim.Max = rlimInf64
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							rlim.Max = uint64(rl.Max)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setrlimit(resource int, rlim *Rlimit) (err error) {
 | 
				
			||||||
 | 
						err = prlimit(0, resource, rlim, nil)
 | 
				
			||||||
 | 
						if err != ENOSYS {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rl := rlimit32{}
 | 
				
			||||||
 | 
						if rlim.Cur == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Cur = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Cur < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Cur = uint32(rlim.Cur)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rlim.Max == rlimInf64 {
 | 
				
			||||||
 | 
							rl.Max = rlimInf32
 | 
				
			||||||
 | 
						} else if rlim.Max < uint64(rlimInf32) {
 | 
				
			||||||
 | 
							rl.Max = uint32(rlim.Max)
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return setrlimit(resource, &rl)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return uint64(r.Regs[64]) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = uint32(pc) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,135 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build linux
 | 
				
			||||||
 | 
					// +build ppc64 ppc64le
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_UGETRLIMIT
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Ioperm(from int, num int, on int) (err error)
 | 
				
			||||||
 | 
					//sys	Iopl(level int) (err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error) = SYS_SYNC_FILE_RANGE2
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 65536 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					//sysnb	Time(t *Time_t) (tt Time_t, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Nip }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe(p *[2]_C_int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe(&pp)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,328 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build s390x,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Fadvise(fd int, offset int64, length int64, advice int) (err error) = SYS_FADVISE64
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (tt Time_t, err error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err = Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, 0) // pipe2 is the same as pipe when flags are set to 0.
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Ioperm(from int, num int, on int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Iopl(level int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Psw.Addr }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Psw.Addr = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Linux on s390x uses the old mmap interface, which requires arguments to be passed in a struct.
 | 
				
			||||||
 | 
					// mmap2 also requires arguments to be passed in a struct; it is currently not exposed in <asm/unistd.h>.
 | 
				
			||||||
 | 
					func mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) {
 | 
				
			||||||
 | 
						mmap_args := [6]uintptr{addr, length, uintptr(prot), uintptr(flags), uintptr(fd), uintptr(offset)}
 | 
				
			||||||
 | 
						r0, _, e1 := Syscall(SYS_MMAP, uintptr(unsafe.Pointer(&mmap_args[0])), 0, 0)
 | 
				
			||||||
 | 
						xaddr = uintptr(r0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = errnoErr(e1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// On s390x Linux, all the socket calls go through an extra indirection.
 | 
				
			||||||
 | 
					// The arguments to the underlying system call (SYS_SOCKETCALL) are the
 | 
				
			||||||
 | 
					// number below and a pointer to an array of uintptr.
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// see linux/net.h
 | 
				
			||||||
 | 
						netSocket      = 1
 | 
				
			||||||
 | 
						netBind        = 2
 | 
				
			||||||
 | 
						netConnect     = 3
 | 
				
			||||||
 | 
						netListen      = 4
 | 
				
			||||||
 | 
						netAccept      = 5
 | 
				
			||||||
 | 
						netGetSockName = 6
 | 
				
			||||||
 | 
						netGetPeerName = 7
 | 
				
			||||||
 | 
						netSocketPair  = 8
 | 
				
			||||||
 | 
						netSend        = 9
 | 
				
			||||||
 | 
						netRecv        = 10
 | 
				
			||||||
 | 
						netSendTo      = 11
 | 
				
			||||||
 | 
						netRecvFrom    = 12
 | 
				
			||||||
 | 
						netShutdown    = 13
 | 
				
			||||||
 | 
						netSetSockOpt  = 14
 | 
				
			||||||
 | 
						netGetSockOpt  = 15
 | 
				
			||||||
 | 
						netSendMsg     = 16
 | 
				
			||||||
 | 
						netRecvMsg     = 17
 | 
				
			||||||
 | 
						netAccept4     = 18
 | 
				
			||||||
 | 
						netRecvMMsg    = 19
 | 
				
			||||||
 | 
						netSendMMsg    = 20
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (int, error) {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
 | 
				
			||||||
 | 
						fd, _, err := Syscall(SYS_SOCKETCALL, netAccept, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(fd), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (int, error) {
 | 
				
			||||||
 | 
						args := [4]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)), uintptr(flags)}
 | 
				
			||||||
 | 
						fd, _, err := Syscall(SYS_SOCKETCALL, netAccept4, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(fd), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getsockname(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
 | 
				
			||||||
 | 
						_, _, err := RawSyscall(SYS_SOCKETCALL, netGetSockName, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getpeername(s int, rsa *RawSockaddrAny, addrlen *_Socklen) error {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen))}
 | 
				
			||||||
 | 
						_, _, err := RawSyscall(SYS_SOCKETCALL, netGetPeerName, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socketpair(domain int, typ int, flags int, fd *[2]int32) error {
 | 
				
			||||||
 | 
						args := [4]uintptr{uintptr(domain), uintptr(typ), uintptr(flags), uintptr(unsafe.Pointer(fd))}
 | 
				
			||||||
 | 
						_, _, err := RawSyscall(SYS_SOCKETCALL, netSocketPair, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func bind(s int, addr unsafe.Pointer, addrlen _Socklen) error {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netBind, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func connect(s int, addr unsafe.Pointer, addrlen _Socklen) error {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(addr), uintptr(addrlen)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netConnect, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func socket(domain int, typ int, proto int) (int, error) {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(domain), uintptr(typ), uintptr(proto)}
 | 
				
			||||||
 | 
						fd, _, err := RawSyscall(SYS_SOCKETCALL, netSocket, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(fd), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) error {
 | 
				
			||||||
 | 
						args := [5]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val), uintptr(unsafe.Pointer(vallen))}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netGetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) error {
 | 
				
			||||||
 | 
						args := [4]uintptr{uintptr(s), uintptr(level), uintptr(name), uintptr(val)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netSetSockOpt, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func recvfrom(s int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (int, error) {
 | 
				
			||||||
 | 
						var base uintptr
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							base = uintptr(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen))}
 | 
				
			||||||
 | 
						n, _, err := Syscall(SYS_SOCKETCALL, netRecvFrom, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(n), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendto(s int, p []byte, flags int, to unsafe.Pointer, addrlen _Socklen) error {
 | 
				
			||||||
 | 
						var base uintptr
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							base = uintptr(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						args := [6]uintptr{uintptr(s), base, uintptr(len(p)), uintptr(flags), uintptr(to), uintptr(addrlen)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netSendTo, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func recvmsg(s int, msg *Msghdr, flags int) (int, error) {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
 | 
				
			||||||
 | 
						n, _, err := Syscall(SYS_SOCKETCALL, netRecvMsg, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(n), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendmsg(s int, msg *Msghdr, flags int) (int, error) {
 | 
				
			||||||
 | 
						args := [3]uintptr{uintptr(s), uintptr(unsafe.Pointer(msg)), uintptr(flags)}
 | 
				
			||||||
 | 
						n, _, err := Syscall(SYS_SOCKETCALL, netSendMsg, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(n), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Listen(s int, n int) error {
 | 
				
			||||||
 | 
						args := [2]uintptr{uintptr(s), uintptr(n)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netListen, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Shutdown(s, how int) error {
 | 
				
			||||||
 | 
						args := [2]uintptr{uintptr(s), uintptr(how)}
 | 
				
			||||||
 | 
						_, _, err := Syscall(SYS_SOCKETCALL, netShutdown, uintptr(unsafe.Pointer(&args)), 0)
 | 
				
			||||||
 | 
						if err != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,169 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build sparc64,linux
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"sync/atomic"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Fstatfs(fd int, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sysnb	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sysnb	InotifyInit() (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Lchown(path string, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Listen(s int, n int) (err error)
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n int, err error) = SYS_PWRITE64
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
 | 
				
			||||||
 | 
					//sys	Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
 | 
				
			||||||
 | 
					//sys	Setfsgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Setfsuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setregid(rgid int, egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setrlimit(resource int, rlim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setreuid(ruid int, euid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(fd int, how int) (err error)
 | 
				
			||||||
 | 
					//sys	Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Statfs(path string, buf *Statfs_t) (err error)
 | 
				
			||||||
 | 
					//sys	SyncFileRange(fd int, off int64, n int64, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getgroups(n int, list *_Gid_t) (nn int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(n int, list *_Gid_t) (err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
 | 
				
			||||||
 | 
					//sysnb	socket(domain int, typ int, proto int) (fd int, err error)
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sysnb	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
 | 
				
			||||||
 | 
					//sys	mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sysconf(name int) (n int64, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// pageSize caches the value of Getpagesize, since it can't change
 | 
				
			||||||
 | 
					// once the system is booted.
 | 
				
			||||||
 | 
					var pageSize int64 // accessed atomically
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int {
 | 
				
			||||||
 | 
						n := atomic.LoadInt64(&pageSize)
 | 
				
			||||||
 | 
						if n == 0 {
 | 
				
			||||||
 | 
							n, _ = sysconf(_SC_PAGESIZE)
 | 
				
			||||||
 | 
							atomic.StoreInt64(&pageSize, n)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Ioperm(from int, num int, on int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Iopl(level int) (err error) {
 | 
				
			||||||
 | 
						return ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Time(t *Time_t) (tt Time_t, err error) {
 | 
				
			||||||
 | 
						var tv Timeval
 | 
				
			||||||
 | 
						err = Gettimeofday(&tv)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if t != nil {
 | 
				
			||||||
 | 
							*t = Time_t(tv.Sec)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return Time_t(tv.Sec), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) PC() uint64 { return r.Tpc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *PtraceRegs) SetPC(pc uint64) { r.Tpc = pc }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe(p *[2]_C_int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe(&pp)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe2(p *[2]_C_int, flags int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe2(p []int, flags int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe2(&pp, flags)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	poll(fds *PollFd, nfds int, timeout int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Poll(fds []PollFd, timeout int) (n int, err error) {
 | 
				
			||||||
 | 
						if len(fds) == 0 {
 | 
				
			||||||
 | 
							return poll(nil, 0, timeout)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return poll(&fds[0], len(fds), timeout)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,476 @@
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NetBSD 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 unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
 | 
						Len    uint8
 | 
				
			||||||
 | 
						Family uint8
 | 
				
			||||||
 | 
						Index  uint16
 | 
				
			||||||
 | 
						Type   uint8
 | 
				
			||||||
 | 
						Nlen   uint8
 | 
				
			||||||
 | 
						Alen   uint8
 | 
				
			||||||
 | 
						Slen   uint8
 | 
				
			||||||
 | 
						Data   [12]int8
 | 
				
			||||||
 | 
						raw    RawSockaddrDatalink
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sysctlNodes(mib []_C_int) (nodes []Sysctlnode, err error) {
 | 
				
			||||||
 | 
						var olen uintptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get a list of all sysctl nodes below the given MIB by performing
 | 
				
			||||||
 | 
						// a sysctl for the given MIB with CTL_QUERY appended.
 | 
				
			||||||
 | 
						mib = append(mib, CTL_QUERY)
 | 
				
			||||||
 | 
						qnode := Sysctlnode{Flags: SYSCTL_VERS_1}
 | 
				
			||||||
 | 
						qp := (*byte)(unsafe.Pointer(&qnode))
 | 
				
			||||||
 | 
						sz := unsafe.Sizeof(qnode)
 | 
				
			||||||
 | 
						if err = sysctl(mib, nil, &olen, qp, sz); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Now that we know the size, get the actual nodes.
 | 
				
			||||||
 | 
						nodes = make([]Sysctlnode, olen/sz)
 | 
				
			||||||
 | 
						np := (*byte)(unsafe.Pointer(&nodes[0]))
 | 
				
			||||||
 | 
						if err = sysctl(mib, np, &olen, qp, sz); err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return nodes, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nametomib(name string) (mib []_C_int, err error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Split name into components.
 | 
				
			||||||
 | 
						var parts []string
 | 
				
			||||||
 | 
						last := 0
 | 
				
			||||||
 | 
						for i := 0; i < len(name); i++ {
 | 
				
			||||||
 | 
							if name[i] == '.' {
 | 
				
			||||||
 | 
								parts = append(parts, name[last:i])
 | 
				
			||||||
 | 
								last = i + 1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						parts = append(parts, name[last:])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Discover the nodes and construct the MIB OID.
 | 
				
			||||||
 | 
						for partno, part := range parts {
 | 
				
			||||||
 | 
							nodes, err := sysctlNodes(mib)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for _, node := range nodes {
 | 
				
			||||||
 | 
								n := make([]byte, 0)
 | 
				
			||||||
 | 
								for i := range node.Name {
 | 
				
			||||||
 | 
									if node.Name[i] != 0 {
 | 
				
			||||||
 | 
										n = append(n, byte(node.Name[i]))
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if string(n) == part {
 | 
				
			||||||
 | 
									mib = append(mib, _C_int(node.Num))
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if len(mib) != partno+1 {
 | 
				
			||||||
 | 
								return nil, EINVAL
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return mib, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe() (fd1 int, fd2 int, err error)
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						p[0], p[1], err = pipe()
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys getdents(fd int, buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
 | 
						return getdents(fd, buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						return -1, ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	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	Fsync(fd int) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//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 syscall.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	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (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	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n 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)
 | 
				
			||||||
 | 
					//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	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	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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// ____semctl13
 | 
				
			||||||
 | 
					// __clone
 | 
				
			||||||
 | 
					// __fhopen40
 | 
				
			||||||
 | 
					// __fhstat40
 | 
				
			||||||
 | 
					// __fhstatvfs140
 | 
				
			||||||
 | 
					// __fstat30
 | 
				
			||||||
 | 
					// __getcwd
 | 
				
			||||||
 | 
					// __getfh30
 | 
				
			||||||
 | 
					// __getlogin
 | 
				
			||||||
 | 
					// __lstat30
 | 
				
			||||||
 | 
					// __mount50
 | 
				
			||||||
 | 
					// __msgctl13
 | 
				
			||||||
 | 
					// __msync13
 | 
				
			||||||
 | 
					// __ntp_gettime30
 | 
				
			||||||
 | 
					// __posix_chown
 | 
				
			||||||
 | 
					// __posix_fadvise50
 | 
				
			||||||
 | 
					// __posix_fchown
 | 
				
			||||||
 | 
					// __posix_lchown
 | 
				
			||||||
 | 
					// __posix_rename
 | 
				
			||||||
 | 
					// __setlogin
 | 
				
			||||||
 | 
					// __shmctl13
 | 
				
			||||||
 | 
					// __sigaction_sigtramp
 | 
				
			||||||
 | 
					// __sigaltstack14
 | 
				
			||||||
 | 
					// __sigpending14
 | 
				
			||||||
 | 
					// __sigprocmask14
 | 
				
			||||||
 | 
					// __sigsuspend14
 | 
				
			||||||
 | 
					// __sigtimedwait
 | 
				
			||||||
 | 
					// __stat30
 | 
				
			||||||
 | 
					// __syscall
 | 
				
			||||||
 | 
					// __vfork14
 | 
				
			||||||
 | 
					// _ksem_close
 | 
				
			||||||
 | 
					// _ksem_destroy
 | 
				
			||||||
 | 
					// _ksem_getvalue
 | 
				
			||||||
 | 
					// _ksem_init
 | 
				
			||||||
 | 
					// _ksem_open
 | 
				
			||||||
 | 
					// _ksem_post
 | 
				
			||||||
 | 
					// _ksem_trywait
 | 
				
			||||||
 | 
					// _ksem_unlink
 | 
				
			||||||
 | 
					// _ksem_wait
 | 
				
			||||||
 | 
					// _lwp_continue
 | 
				
			||||||
 | 
					// _lwp_create
 | 
				
			||||||
 | 
					// _lwp_ctl
 | 
				
			||||||
 | 
					// _lwp_detach
 | 
				
			||||||
 | 
					// _lwp_exit
 | 
				
			||||||
 | 
					// _lwp_getname
 | 
				
			||||||
 | 
					// _lwp_getprivate
 | 
				
			||||||
 | 
					// _lwp_kill
 | 
				
			||||||
 | 
					// _lwp_park
 | 
				
			||||||
 | 
					// _lwp_self
 | 
				
			||||||
 | 
					// _lwp_setname
 | 
				
			||||||
 | 
					// _lwp_setprivate
 | 
				
			||||||
 | 
					// _lwp_suspend
 | 
				
			||||||
 | 
					// _lwp_unpark
 | 
				
			||||||
 | 
					// _lwp_unpark_all
 | 
				
			||||||
 | 
					// _lwp_wait
 | 
				
			||||||
 | 
					// _lwp_wakeup
 | 
				
			||||||
 | 
					// _pset_bind
 | 
				
			||||||
 | 
					// _sched_getaffinity
 | 
				
			||||||
 | 
					// _sched_getparam
 | 
				
			||||||
 | 
					// _sched_setaffinity
 | 
				
			||||||
 | 
					// _sched_setparam
 | 
				
			||||||
 | 
					// acct
 | 
				
			||||||
 | 
					// aio_cancel
 | 
				
			||||||
 | 
					// aio_error
 | 
				
			||||||
 | 
					// aio_fsync
 | 
				
			||||||
 | 
					// aio_read
 | 
				
			||||||
 | 
					// aio_return
 | 
				
			||||||
 | 
					// aio_suspend
 | 
				
			||||||
 | 
					// aio_write
 | 
				
			||||||
 | 
					// break
 | 
				
			||||||
 | 
					// clock_getres
 | 
				
			||||||
 | 
					// clock_gettime
 | 
				
			||||||
 | 
					// clock_settime
 | 
				
			||||||
 | 
					// compat_09_ogetdomainname
 | 
				
			||||||
 | 
					// compat_09_osetdomainname
 | 
				
			||||||
 | 
					// compat_09_ouname
 | 
				
			||||||
 | 
					// compat_10_omsgsys
 | 
				
			||||||
 | 
					// compat_10_osemsys
 | 
				
			||||||
 | 
					// compat_10_oshmsys
 | 
				
			||||||
 | 
					// compat_12_fstat12
 | 
				
			||||||
 | 
					// compat_12_getdirentries
 | 
				
			||||||
 | 
					// compat_12_lstat12
 | 
				
			||||||
 | 
					// compat_12_msync
 | 
				
			||||||
 | 
					// compat_12_oreboot
 | 
				
			||||||
 | 
					// compat_12_oswapon
 | 
				
			||||||
 | 
					// compat_12_stat12
 | 
				
			||||||
 | 
					// compat_13_sigaction13
 | 
				
			||||||
 | 
					// compat_13_sigaltstack13
 | 
				
			||||||
 | 
					// compat_13_sigpending13
 | 
				
			||||||
 | 
					// compat_13_sigprocmask13
 | 
				
			||||||
 | 
					// compat_13_sigreturn13
 | 
				
			||||||
 | 
					// compat_13_sigsuspend13
 | 
				
			||||||
 | 
					// compat_14___semctl
 | 
				
			||||||
 | 
					// compat_14_msgctl
 | 
				
			||||||
 | 
					// compat_14_shmctl
 | 
				
			||||||
 | 
					// compat_16___sigaction14
 | 
				
			||||||
 | 
					// compat_16___sigreturn14
 | 
				
			||||||
 | 
					// compat_20_fhstatfs
 | 
				
			||||||
 | 
					// compat_20_fstatfs
 | 
				
			||||||
 | 
					// compat_20_getfsstat
 | 
				
			||||||
 | 
					// compat_20_statfs
 | 
				
			||||||
 | 
					// compat_30___fhstat30
 | 
				
			||||||
 | 
					// compat_30___fstat13
 | 
				
			||||||
 | 
					// compat_30___lstat13
 | 
				
			||||||
 | 
					// compat_30___stat13
 | 
				
			||||||
 | 
					// compat_30_fhopen
 | 
				
			||||||
 | 
					// compat_30_fhstat
 | 
				
			||||||
 | 
					// compat_30_fhstatvfs1
 | 
				
			||||||
 | 
					// compat_30_getdents
 | 
				
			||||||
 | 
					// compat_30_getfh
 | 
				
			||||||
 | 
					// compat_30_ntp_gettime
 | 
				
			||||||
 | 
					// compat_30_socket
 | 
				
			||||||
 | 
					// compat_40_mount
 | 
				
			||||||
 | 
					// compat_43_fstat43
 | 
				
			||||||
 | 
					// compat_43_lstat43
 | 
				
			||||||
 | 
					// compat_43_oaccept
 | 
				
			||||||
 | 
					// compat_43_ocreat
 | 
				
			||||||
 | 
					// compat_43_oftruncate
 | 
				
			||||||
 | 
					// compat_43_ogetdirentries
 | 
				
			||||||
 | 
					// compat_43_ogetdtablesize
 | 
				
			||||||
 | 
					// compat_43_ogethostid
 | 
				
			||||||
 | 
					// compat_43_ogethostname
 | 
				
			||||||
 | 
					// compat_43_ogetkerninfo
 | 
				
			||||||
 | 
					// compat_43_ogetpagesize
 | 
				
			||||||
 | 
					// compat_43_ogetpeername
 | 
				
			||||||
 | 
					// compat_43_ogetrlimit
 | 
				
			||||||
 | 
					// compat_43_ogetsockname
 | 
				
			||||||
 | 
					// compat_43_okillpg
 | 
				
			||||||
 | 
					// compat_43_olseek
 | 
				
			||||||
 | 
					// compat_43_ommap
 | 
				
			||||||
 | 
					// compat_43_oquota
 | 
				
			||||||
 | 
					// compat_43_orecv
 | 
				
			||||||
 | 
					// compat_43_orecvfrom
 | 
				
			||||||
 | 
					// compat_43_orecvmsg
 | 
				
			||||||
 | 
					// compat_43_osend
 | 
				
			||||||
 | 
					// compat_43_osendmsg
 | 
				
			||||||
 | 
					// compat_43_osethostid
 | 
				
			||||||
 | 
					// compat_43_osethostname
 | 
				
			||||||
 | 
					// compat_43_osetrlimit
 | 
				
			||||||
 | 
					// compat_43_osigblock
 | 
				
			||||||
 | 
					// compat_43_osigsetmask
 | 
				
			||||||
 | 
					// compat_43_osigstack
 | 
				
			||||||
 | 
					// compat_43_osigvec
 | 
				
			||||||
 | 
					// compat_43_otruncate
 | 
				
			||||||
 | 
					// compat_43_owait
 | 
				
			||||||
 | 
					// compat_43_stat43
 | 
				
			||||||
 | 
					// execve
 | 
				
			||||||
 | 
					// extattr_delete_fd
 | 
				
			||||||
 | 
					// extattr_delete_file
 | 
				
			||||||
 | 
					// extattr_delete_link
 | 
				
			||||||
 | 
					// extattr_get_fd
 | 
				
			||||||
 | 
					// extattr_get_file
 | 
				
			||||||
 | 
					// extattr_get_link
 | 
				
			||||||
 | 
					// extattr_list_fd
 | 
				
			||||||
 | 
					// extattr_list_file
 | 
				
			||||||
 | 
					// extattr_list_link
 | 
				
			||||||
 | 
					// extattr_set_fd
 | 
				
			||||||
 | 
					// extattr_set_file
 | 
				
			||||||
 | 
					// extattr_set_link
 | 
				
			||||||
 | 
					// extattrctl
 | 
				
			||||||
 | 
					// fchroot
 | 
				
			||||||
 | 
					// fdatasync
 | 
				
			||||||
 | 
					// fgetxattr
 | 
				
			||||||
 | 
					// fktrace
 | 
				
			||||||
 | 
					// flistxattr
 | 
				
			||||||
 | 
					// fork
 | 
				
			||||||
 | 
					// fremovexattr
 | 
				
			||||||
 | 
					// fsetxattr
 | 
				
			||||||
 | 
					// fstatvfs1
 | 
				
			||||||
 | 
					// fsync_range
 | 
				
			||||||
 | 
					// getcontext
 | 
				
			||||||
 | 
					// getitimer
 | 
				
			||||||
 | 
					// getvfsstat
 | 
				
			||||||
 | 
					// getxattr
 | 
				
			||||||
 | 
					// ioctl
 | 
				
			||||||
 | 
					// ktrace
 | 
				
			||||||
 | 
					// lchflags
 | 
				
			||||||
 | 
					// lchmod
 | 
				
			||||||
 | 
					// lfs_bmapv
 | 
				
			||||||
 | 
					// lfs_markv
 | 
				
			||||||
 | 
					// lfs_segclean
 | 
				
			||||||
 | 
					// lfs_segwait
 | 
				
			||||||
 | 
					// lgetxattr
 | 
				
			||||||
 | 
					// lio_listio
 | 
				
			||||||
 | 
					// listxattr
 | 
				
			||||||
 | 
					// llistxattr
 | 
				
			||||||
 | 
					// lremovexattr
 | 
				
			||||||
 | 
					// lseek
 | 
				
			||||||
 | 
					// lsetxattr
 | 
				
			||||||
 | 
					// lutimes
 | 
				
			||||||
 | 
					// madvise
 | 
				
			||||||
 | 
					// mincore
 | 
				
			||||||
 | 
					// minherit
 | 
				
			||||||
 | 
					// modctl
 | 
				
			||||||
 | 
					// mq_close
 | 
				
			||||||
 | 
					// mq_getattr
 | 
				
			||||||
 | 
					// mq_notify
 | 
				
			||||||
 | 
					// mq_open
 | 
				
			||||||
 | 
					// mq_receive
 | 
				
			||||||
 | 
					// mq_send
 | 
				
			||||||
 | 
					// mq_setattr
 | 
				
			||||||
 | 
					// mq_timedreceive
 | 
				
			||||||
 | 
					// mq_timedsend
 | 
				
			||||||
 | 
					// mq_unlink
 | 
				
			||||||
 | 
					// mremap
 | 
				
			||||||
 | 
					// msgget
 | 
				
			||||||
 | 
					// msgrcv
 | 
				
			||||||
 | 
					// msgsnd
 | 
				
			||||||
 | 
					// nfssvc
 | 
				
			||||||
 | 
					// ntp_adjtime
 | 
				
			||||||
 | 
					// pmc_control
 | 
				
			||||||
 | 
					// pmc_get_info
 | 
				
			||||||
 | 
					// poll
 | 
				
			||||||
 | 
					// pollts
 | 
				
			||||||
 | 
					// preadv
 | 
				
			||||||
 | 
					// profil
 | 
				
			||||||
 | 
					// pselect
 | 
				
			||||||
 | 
					// pset_assign
 | 
				
			||||||
 | 
					// pset_create
 | 
				
			||||||
 | 
					// pset_destroy
 | 
				
			||||||
 | 
					// ptrace
 | 
				
			||||||
 | 
					// pwritev
 | 
				
			||||||
 | 
					// quotactl
 | 
				
			||||||
 | 
					// rasctl
 | 
				
			||||||
 | 
					// readv
 | 
				
			||||||
 | 
					// reboot
 | 
				
			||||||
 | 
					// removexattr
 | 
				
			||||||
 | 
					// sa_enable
 | 
				
			||||||
 | 
					// sa_preempt
 | 
				
			||||||
 | 
					// sa_register
 | 
				
			||||||
 | 
					// sa_setconcurrency
 | 
				
			||||||
 | 
					// sa_stacks
 | 
				
			||||||
 | 
					// sa_yield
 | 
				
			||||||
 | 
					// sbrk
 | 
				
			||||||
 | 
					// sched_yield
 | 
				
			||||||
 | 
					// semconfig
 | 
				
			||||||
 | 
					// semget
 | 
				
			||||||
 | 
					// semop
 | 
				
			||||||
 | 
					// setcontext
 | 
				
			||||||
 | 
					// setitimer
 | 
				
			||||||
 | 
					// setxattr
 | 
				
			||||||
 | 
					// shmat
 | 
				
			||||||
 | 
					// shmdt
 | 
				
			||||||
 | 
					// shmget
 | 
				
			||||||
 | 
					// sstk
 | 
				
			||||||
 | 
					// statvfs1
 | 
				
			||||||
 | 
					// swapctl
 | 
				
			||||||
 | 
					// sysarch
 | 
				
			||||||
 | 
					// syscall
 | 
				
			||||||
 | 
					// timer_create
 | 
				
			||||||
 | 
					// timer_delete
 | 
				
			||||||
 | 
					// timer_getoverrun
 | 
				
			||||||
 | 
					// timer_gettime
 | 
				
			||||||
 | 
					// timer_settime
 | 
				
			||||||
 | 
					// undelete
 | 
				
			||||||
 | 
					// utrace
 | 
				
			||||||
 | 
					// uuidgen
 | 
				
			||||||
 | 
					// vadvise
 | 
				
			||||||
 | 
					// vfork
 | 
				
			||||||
 | 
					// writev
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build 386,netbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = uint32(mode)
 | 
				
			||||||
 | 
						k.Flags = uint32(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,netbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int64(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = uint32(mode)
 | 
				
			||||||
 | 
						k.Flags = uint32(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					// Copyright 2013 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build arm,netbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = uint32(mode)
 | 
				
			||||||
 | 
						k.Flags = uint32(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,11 @@
 | 
				
			||||||
 | 
					// Copyright 2013 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build dragonfly freebsd netbsd openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ImplementsGetwd = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getwd() (string, error) { return "", ENOTSUP }
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,287 @@
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// OpenBSD 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 unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
 | 
						Len    uint8
 | 
				
			||||||
 | 
						Family uint8
 | 
				
			||||||
 | 
						Index  uint16
 | 
				
			||||||
 | 
						Type   uint8
 | 
				
			||||||
 | 
						Nlen   uint8
 | 
				
			||||||
 | 
						Alen   uint8
 | 
				
			||||||
 | 
						Slen   uint8
 | 
				
			||||||
 | 
						Data   [24]int8
 | 
				
			||||||
 | 
						raw    RawSockaddrDatalink
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func nametomib(name string) (mib []_C_int, err error) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Perform lookup via a binary search
 | 
				
			||||||
 | 
						left := 0
 | 
				
			||||||
 | 
						right := len(sysctlMib) - 1
 | 
				
			||||||
 | 
						for {
 | 
				
			||||||
 | 
							idx := left + (right-left)/2
 | 
				
			||||||
 | 
							switch {
 | 
				
			||||||
 | 
							case name == sysctlMib[idx].ctlname:
 | 
				
			||||||
 | 
								return sysctlMib[idx].ctloid, nil
 | 
				
			||||||
 | 
							case name > sysctlMib[idx].ctlname:
 | 
				
			||||||
 | 
								left = idx + 1
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								right = idx - 1
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if left > right {
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, EINVAL
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Fileno), unsafe.Sizeof(Dirent{}.Fileno))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Namlen), unsafe.Sizeof(Dirent{}.Namlen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb pipe(p *[2]_C_int) (err error)
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						err = pipe(&pp)
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys getdents(fd int, buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
 | 
				
			||||||
 | 
						return getdents(fd, buf)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						return -1, ENOSYS
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	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)
 | 
				
			||||||
 | 
					//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 syscall.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	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (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	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n 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	Setresgid(rgid int, egid int, sgid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setresuid(ruid int, euid int, suid 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	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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					// __getcwd
 | 
				
			||||||
 | 
					// __semctl
 | 
				
			||||||
 | 
					// __syscall
 | 
				
			||||||
 | 
					// __sysctl
 | 
				
			||||||
 | 
					// adjfreq
 | 
				
			||||||
 | 
					// break
 | 
				
			||||||
 | 
					// clock_getres
 | 
				
			||||||
 | 
					// clock_gettime
 | 
				
			||||||
 | 
					// clock_settime
 | 
				
			||||||
 | 
					// closefrom
 | 
				
			||||||
 | 
					// execve
 | 
				
			||||||
 | 
					// faccessat
 | 
				
			||||||
 | 
					// fchmodat
 | 
				
			||||||
 | 
					// fchownat
 | 
				
			||||||
 | 
					// fcntl
 | 
				
			||||||
 | 
					// fhopen
 | 
				
			||||||
 | 
					// fhstat
 | 
				
			||||||
 | 
					// fhstatfs
 | 
				
			||||||
 | 
					// fork
 | 
				
			||||||
 | 
					// fstatat
 | 
				
			||||||
 | 
					// futimens
 | 
				
			||||||
 | 
					// getfh
 | 
				
			||||||
 | 
					// getgid
 | 
				
			||||||
 | 
					// getitimer
 | 
				
			||||||
 | 
					// getlogin
 | 
				
			||||||
 | 
					// getresgid
 | 
				
			||||||
 | 
					// getresuid
 | 
				
			||||||
 | 
					// getrtable
 | 
				
			||||||
 | 
					// getthrid
 | 
				
			||||||
 | 
					// ioctl
 | 
				
			||||||
 | 
					// ktrace
 | 
				
			||||||
 | 
					// lfs_bmapv
 | 
				
			||||||
 | 
					// lfs_markv
 | 
				
			||||||
 | 
					// lfs_segclean
 | 
				
			||||||
 | 
					// lfs_segwait
 | 
				
			||||||
 | 
					// linkat
 | 
				
			||||||
 | 
					// mincore
 | 
				
			||||||
 | 
					// minherit
 | 
				
			||||||
 | 
					// mkdirat
 | 
				
			||||||
 | 
					// mkfifoat
 | 
				
			||||||
 | 
					// mknodat
 | 
				
			||||||
 | 
					// mount
 | 
				
			||||||
 | 
					// mquery
 | 
				
			||||||
 | 
					// msgctl
 | 
				
			||||||
 | 
					// msgget
 | 
				
			||||||
 | 
					// msgrcv
 | 
				
			||||||
 | 
					// msgsnd
 | 
				
			||||||
 | 
					// nfssvc
 | 
				
			||||||
 | 
					// nnpfspioctl
 | 
				
			||||||
 | 
					// openat
 | 
				
			||||||
 | 
					// poll
 | 
				
			||||||
 | 
					// preadv
 | 
				
			||||||
 | 
					// profil
 | 
				
			||||||
 | 
					// pwritev
 | 
				
			||||||
 | 
					// quotactl
 | 
				
			||||||
 | 
					// readlinkat
 | 
				
			||||||
 | 
					// readv
 | 
				
			||||||
 | 
					// reboot
 | 
				
			||||||
 | 
					// renameat
 | 
				
			||||||
 | 
					// rfork
 | 
				
			||||||
 | 
					// sched_yield
 | 
				
			||||||
 | 
					// semget
 | 
				
			||||||
 | 
					// semop
 | 
				
			||||||
 | 
					// setgroups
 | 
				
			||||||
 | 
					// setitimer
 | 
				
			||||||
 | 
					// setrtable
 | 
				
			||||||
 | 
					// setsockopt
 | 
				
			||||||
 | 
					// shmat
 | 
				
			||||||
 | 
					// shmctl
 | 
				
			||||||
 | 
					// shmdt
 | 
				
			||||||
 | 
					// shmget
 | 
				
			||||||
 | 
					// sigaction
 | 
				
			||||||
 | 
					// sigaltstack
 | 
				
			||||||
 | 
					// sigpending
 | 
				
			||||||
 | 
					// sigprocmask
 | 
				
			||||||
 | 
					// sigreturn
 | 
				
			||||||
 | 
					// sigsuspend
 | 
				
			||||||
 | 
					// symlinkat
 | 
				
			||||||
 | 
					// sysarch
 | 
				
			||||||
 | 
					// syscall
 | 
				
			||||||
 | 
					// threxit
 | 
				
			||||||
 | 
					// thrsigdivert
 | 
				
			||||||
 | 
					// thrsleep
 | 
				
			||||||
 | 
					// thrwakeup
 | 
				
			||||||
 | 
					// unlinkat
 | 
				
			||||||
 | 
					// utimensat
 | 
				
			||||||
 | 
					// vfork
 | 
				
			||||||
 | 
					// writev
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build 386,openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						ts.Nsec = int32(nsec % 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = int32(nsec % 1e9 / 1e3)
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint32(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,42 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,openbsd
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int { return 4096 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						tv.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetKevent(k *Kevent_t, fd, mode, flags int) {
 | 
				
			||||||
 | 
						k.Ident = uint64(fd)
 | 
				
			||||||
 | 
						k.Filter = int16(mode)
 | 
				
			||||||
 | 
						k.Flags = uint16(flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (msghdr *Msghdr) SetControllen(length int) {
 | 
				
			||||||
 | 
						msghdr.Controllen = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,713 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Solaris 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_solaris.go or syscall_unix.go.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"sync/atomic"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Implemented in runtime/syscall_solaris.go.
 | 
				
			||||||
 | 
					type syscallFunc uintptr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func rawSysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					func sysvicall6(trap, nargs, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrDatalink struct {
 | 
				
			||||||
 | 
						Family uint16
 | 
				
			||||||
 | 
						Index  uint16
 | 
				
			||||||
 | 
						Type   uint8
 | 
				
			||||||
 | 
						Nlen   uint8
 | 
				
			||||||
 | 
						Alen   uint8
 | 
				
			||||||
 | 
						Slen   uint8
 | 
				
			||||||
 | 
						Data   [244]int8
 | 
				
			||||||
 | 
						raw    RawSockaddrDatalink
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func clen(n []byte) int {
 | 
				
			||||||
 | 
						for i := 0; i < len(n); i++ {
 | 
				
			||||||
 | 
							if n[i] == 0 {
 | 
				
			||||||
 | 
								return i
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return len(n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntIno(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntReclen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func direntNamlen(buf []byte) (uint64, bool) {
 | 
				
			||||||
 | 
						reclen, ok := direntReclen(buf)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return 0, false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	pipe(p *[2]_C_int) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Pipe(p []int) (err error) {
 | 
				
			||||||
 | 
						if len(p) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var pp [2]_C_int
 | 
				
			||||||
 | 
						n, err := pipe(&pp)
 | 
				
			||||||
 | 
						if n != 0 {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						p[0] = int(pp[0])
 | 
				
			||||||
 | 
						p[1] = int(pp[1])
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						if sa.Port < 0 || sa.Port > 0xFFFF {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Family = AF_INET
 | 
				
			||||||
 | 
						p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 | 
				
			||||||
 | 
						p[0] = byte(sa.Port >> 8)
 | 
				
			||||||
 | 
						p[1] = byte(sa.Port)
 | 
				
			||||||
 | 
						for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
							sa.raw.Addr[i] = sa.Addr[i]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), SizeofSockaddrInet4, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						if sa.Port < 0 || sa.Port > 0xFFFF {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Family = AF_INET6
 | 
				
			||||||
 | 
						p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
 | 
				
			||||||
 | 
						p[0] = byte(sa.Port >> 8)
 | 
				
			||||||
 | 
						p[1] = byte(sa.Port)
 | 
				
			||||||
 | 
						sa.raw.Scope_id = sa.ZoneId
 | 
				
			||||||
 | 
						for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
							sa.raw.Addr[i] = sa.Addr[i]
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), SizeofSockaddrInet6, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
 | 
				
			||||||
 | 
						name := sa.Name
 | 
				
			||||||
 | 
						n := len(name)
 | 
				
			||||||
 | 
						if n >= len(sa.raw.Path) {
 | 
				
			||||||
 | 
							return nil, 0, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa.raw.Family = AF_UNIX
 | 
				
			||||||
 | 
						for i := 0; i < n; i++ {
 | 
				
			||||||
 | 
							sa.raw.Path[i] = int8(name[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						// length is family (uint16), name, NUL.
 | 
				
			||||||
 | 
						sl := _Socklen(2)
 | 
				
			||||||
 | 
						if n > 0 {
 | 
				
			||||||
 | 
							sl += _Socklen(n) + 1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if sa.raw.Path[0] == '@' {
 | 
				
			||||||
 | 
							sa.raw.Path[0] = 0
 | 
				
			||||||
 | 
							// Don't count trailing NUL for abstract address.
 | 
				
			||||||
 | 
							sl--
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return unsafe.Pointer(&sa.raw), sl, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getsockname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getsockname(fd int) (sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						if err = getsockname(fd, &rsa, &len); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ImplementsGetwd = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	Getcwd(buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getwd() (wd string, err error) {
 | 
				
			||||||
 | 
						var buf [PathMax]byte
 | 
				
			||||||
 | 
						// Getcwd will return an error if it failed for any reason.
 | 
				
			||||||
 | 
						_, err = Getcwd(buf[0:])
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n := clen(buf[:])
 | 
				
			||||||
 | 
						if n < 1 {
 | 
				
			||||||
 | 
							return "", EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(buf[:n]), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Wrapped
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sysnb	getgroups(ngid int, gid *_Gid_t) (n int, err error)
 | 
				
			||||||
 | 
					//sysnb	setgroups(ngid int, gid *_Gid_t) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getgroups() (gids []int, err error) {
 | 
				
			||||||
 | 
						n, err := getgroups(0, nil)
 | 
				
			||||||
 | 
						// Check for error and sanity check group count.  Newer versions of
 | 
				
			||||||
 | 
						// Solaris allow up to 1024 (NGROUPS_MAX).
 | 
				
			||||||
 | 
						if n < 0 || n > 1024 {
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return nil, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						} else if n == 0 {
 | 
				
			||||||
 | 
							return nil, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						a := make([]_Gid_t, n)
 | 
				
			||||||
 | 
						n, err = getgroups(n, &a[0])
 | 
				
			||||||
 | 
						if n == -1 {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						gids = make([]int, n)
 | 
				
			||||||
 | 
						for i, v := range a[0:n] {
 | 
				
			||||||
 | 
							gids[i] = int(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Setgroups(gids []int) (err error) {
 | 
				
			||||||
 | 
						if len(gids) == 0 {
 | 
				
			||||||
 | 
							return setgroups(0, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						a := make([]_Gid_t, len(gids))
 | 
				
			||||||
 | 
						for i, v := range gids {
 | 
				
			||||||
 | 
							a[i] = _Gid_t(v)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return setgroups(len(a), &a[0])
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func ReadDirent(fd int, buf []byte) (n int, err error) {
 | 
				
			||||||
 | 
						// Final argument is (basep *uintptr) and the syscall doesn't take nil.
 | 
				
			||||||
 | 
						// TODO(rsc): Can we use a single global basep for all calls?
 | 
				
			||||||
 | 
						return Getdents(fd, buf, new(uintptr))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Wait status is 7 bits at bottom, either 0 (exited),
 | 
				
			||||||
 | 
					// 0x7F (stopped), or a signal number that caused an exit.
 | 
				
			||||||
 | 
					// The 0x80 bit is whether there was a core dump.
 | 
				
			||||||
 | 
					// An extra number (exit code, signal causing a stop)
 | 
				
			||||||
 | 
					// is in the high bits.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type WaitStatus uint32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						mask  = 0x7F
 | 
				
			||||||
 | 
						core  = 0x80
 | 
				
			||||||
 | 
						shift = 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						exited  = 0
 | 
				
			||||||
 | 
						stopped = 0x7F
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Exited() bool { return w&mask == exited }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) ExitStatus() int {
 | 
				
			||||||
 | 
						if w&mask != exited {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(w >> shift)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Signal() syscall.Signal {
 | 
				
			||||||
 | 
						sig := syscall.Signal(w & mask)
 | 
				
			||||||
 | 
						if sig == stopped || sig == 0 {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sig
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) StopSignal() syscall.Signal {
 | 
				
			||||||
 | 
						if !w.Stopped() {
 | 
				
			||||||
 | 
							return -1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return syscall.Signal(w>>shift) & 0xFF
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (w WaitStatus) TrapCause() int { return -1 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	wait4(pid int32, statusp *_C_int, options int, rusage *Rusage) (wpid int32, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (int, error) {
 | 
				
			||||||
 | 
						var status _C_int
 | 
				
			||||||
 | 
						rpid, err := wait4(int32(pid), &status, options, rusage)
 | 
				
			||||||
 | 
						wpid := int(rpid)
 | 
				
			||||||
 | 
						if wpid == -1 {
 | 
				
			||||||
 | 
							return wpid, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if wstatus != nil {
 | 
				
			||||||
 | 
							*wstatus = WaitStatus(status)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return wpid, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	gethostname(buf []byte) (n int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Gethostname() (name string, err error) {
 | 
				
			||||||
 | 
						var buf [MaxHostNameLen]byte
 | 
				
			||||||
 | 
						n, err := gethostname(buf[:])
 | 
				
			||||||
 | 
						if n != 0 {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n = clen(buf[:])
 | 
				
			||||||
 | 
						if n < 1 {
 | 
				
			||||||
 | 
							return "", EFAULT
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return string(buf[:n]), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	utimes(path string, times *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Utimes(path string, tv []Timeval) (err error) {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return utimes(path, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tv) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	utimensat(fd int, path string, times *[2]Timespec, flag int) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UtimesNano(path string, ts []Timespec) error {
 | 
				
			||||||
 | 
						if ts == nil {
 | 
				
			||||||
 | 
							return utimensat(AT_FDCWD, path, nil, 0)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(ts) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
 | 
				
			||||||
 | 
						if ts == nil {
 | 
				
			||||||
 | 
							return utimensat(dirfd, path, nil, flags)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(ts) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	fcntl(fd int, cmd int, arg int) (val int, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
 | 
				
			||||||
 | 
					func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
 | 
				
			||||||
 | 
						_, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procfcntl)), 3, uintptr(fd), uintptr(cmd), uintptr(unsafe.Pointer(lk)), 0, 0, 0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							return e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	futimesat(fildes int, path *byte, times *[2]Timeval) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Futimesat(dirfd int, path string, tv []Timeval) error {
 | 
				
			||||||
 | 
						pathp, err := BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return futimesat(dirfd, pathp, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tv) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return futimesat(dirfd, pathp, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Solaris doesn't have an futimes function because it allows NULL to be
 | 
				
			||||||
 | 
					// specified as the path for futimesat.  However, Go doesn't like
 | 
				
			||||||
 | 
					// NULL-style string interfaces, so this simple wrapper is provided.
 | 
				
			||||||
 | 
					func Futimes(fd int, tv []Timeval) error {
 | 
				
			||||||
 | 
						if tv == nil {
 | 
				
			||||||
 | 
							return futimesat(fd, nil, nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(tv) != 2 {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return futimesat(fd, nil, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func anyToSockaddr(rsa *RawSockaddrAny) (Sockaddr, error) {
 | 
				
			||||||
 | 
						switch rsa.Addr.Family {
 | 
				
			||||||
 | 
						case AF_UNIX:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrUnix)
 | 
				
			||||||
 | 
							// Assume path ends at NUL.
 | 
				
			||||||
 | 
							// This is not technically the Solaris semantics for
 | 
				
			||||||
 | 
							// abstract Unix domain sockets -- they are supposed
 | 
				
			||||||
 | 
							// to be uninterpreted fixed-size binary blobs -- but
 | 
				
			||||||
 | 
							// everyone uses this convention.
 | 
				
			||||||
 | 
							n := 0
 | 
				
			||||||
 | 
							for n < len(pp.Path) && pp.Path[n] != 0 {
 | 
				
			||||||
 | 
								n++
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
 | 
				
			||||||
 | 
							sa.Name = string(bytes)
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case AF_INET:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrInet4)
 | 
				
			||||||
 | 
							p := (*[2]byte)(unsafe.Pointer(&pp.Port))
 | 
				
			||||||
 | 
							sa.Port = int(p[0])<<8 + int(p[1])
 | 
				
			||||||
 | 
							for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
								sa.Addr[i] = pp.Addr[i]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case AF_INET6:
 | 
				
			||||||
 | 
							pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
 | 
				
			||||||
 | 
							sa := new(SockaddrInet6)
 | 
				
			||||||
 | 
							p := (*[2]byte)(unsafe.Pointer(&pp.Port))
 | 
				
			||||||
 | 
							sa.Port = int(p[0])<<8 + int(p[1])
 | 
				
			||||||
 | 
							sa.ZoneId = pp.Scope_id
 | 
				
			||||||
 | 
							for i := 0; i < len(sa.Addr); i++ {
 | 
				
			||||||
 | 
								sa.Addr[i] = pp.Addr[i]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return sa, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil, EAFNOSUPPORT
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = libsocket.accept
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Accept(fd int) (nfd int, sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						nfd, err = accept(fd, &rsa, &len)
 | 
				
			||||||
 | 
						if nfd == -1 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						sa, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							Close(nfd)
 | 
				
			||||||
 | 
							nfd = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.recvmsg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
 | 
				
			||||||
 | 
						var msg Msghdr
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						msg.Name = (*byte)(unsafe.Pointer(&rsa))
 | 
				
			||||||
 | 
						msg.Namelen = uint32(SizeofSockaddrAny)
 | 
				
			||||||
 | 
						var iov Iovec
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							iov.Base = (*int8)(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
							iov.SetLen(len(p))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var dummy int8
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
 | 
							// receive at least one normal byte
 | 
				
			||||||
 | 
							if len(p) == 0 {
 | 
				
			||||||
 | 
								iov.Base = &dummy
 | 
				
			||||||
 | 
								iov.SetLen(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Accrights = (*int8)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						msg.Iov = &iov
 | 
				
			||||||
 | 
						msg.Iovlen = 1
 | 
				
			||||||
 | 
						if n, err = recvmsg(fd, &msg, flags); n == -1 {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						oobn = int(msg.Accrightslen)
 | 
				
			||||||
 | 
						// source address is only specified if the socket is unconnected
 | 
				
			||||||
 | 
						if rsa.Addr.Family != AF_UNSPEC {
 | 
				
			||||||
 | 
							from, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
 | 
				
			||||||
 | 
						_, err = SendmsgN(fd, p, oob, to, flags)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = libsocket.sendmsg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
 | 
				
			||||||
 | 
						var ptr unsafe.Pointer
 | 
				
			||||||
 | 
						var salen _Socklen
 | 
				
			||||||
 | 
						if to != nil {
 | 
				
			||||||
 | 
							ptr, salen, err = to.sockaddr()
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 0, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var msg Msghdr
 | 
				
			||||||
 | 
						msg.Name = (*byte)(unsafe.Pointer(ptr))
 | 
				
			||||||
 | 
						msg.Namelen = uint32(salen)
 | 
				
			||||||
 | 
						var iov Iovec
 | 
				
			||||||
 | 
						if len(p) > 0 {
 | 
				
			||||||
 | 
							iov.Base = (*int8)(unsafe.Pointer(&p[0]))
 | 
				
			||||||
 | 
							iov.SetLen(len(p))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var dummy int8
 | 
				
			||||||
 | 
						if len(oob) > 0 {
 | 
				
			||||||
 | 
							// send at least one normal byte
 | 
				
			||||||
 | 
							if len(p) == 0 {
 | 
				
			||||||
 | 
								iov.Base = &dummy
 | 
				
			||||||
 | 
								iov.SetLen(1)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							msg.Accrights = (*int8)(unsafe.Pointer(&oob[0]))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						msg.Iov = &iov
 | 
				
			||||||
 | 
						msg.Iovlen = 1
 | 
				
			||||||
 | 
						if n, err = sendmsg(fd, &msg, flags); err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if len(oob) > 0 && len(p) == 0 {
 | 
				
			||||||
 | 
							n = 0
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return n, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	acct(path *byte) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Acct(path string) (err error) {
 | 
				
			||||||
 | 
						if len(path) == 0 {
 | 
				
			||||||
 | 
							// Assume caller wants to disable accounting.
 | 
				
			||||||
 | 
							return acct(nil)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pathp, err := BytePtrFromString(path)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return acct(pathp)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Expose the ioctl function
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	ioctl(fd int, req int, arg uintptr) (err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlSetInt(fd int, req int, value int) (err error) {
 | 
				
			||||||
 | 
						return ioctl(fd, req, uintptr(value))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlSetWinsize(fd int, req int, value *Winsize) (err error) {
 | 
				
			||||||
 | 
						return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlSetTermios(fd int, req int, value *Termios) (err error) {
 | 
				
			||||||
 | 
						return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlSetTermio(fd int, req int, value *Termio) (err error) {
 | 
				
			||||||
 | 
						return ioctl(fd, req, uintptr(unsafe.Pointer(value)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlGetInt(fd int, req int) (int, error) {
 | 
				
			||||||
 | 
						var value int
 | 
				
			||||||
 | 
						err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
 | 
				
			||||||
 | 
						return value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlGetWinsize(fd int, req int) (*Winsize, error) {
 | 
				
			||||||
 | 
						var value Winsize
 | 
				
			||||||
 | 
						err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlGetTermios(fd int, req int) (*Termios, error) {
 | 
				
			||||||
 | 
						var value Termios
 | 
				
			||||||
 | 
						err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func IoctlGetTermio(fd int, req int) (*Termio, error) {
 | 
				
			||||||
 | 
						var value Termio
 | 
				
			||||||
 | 
						err := ioctl(fd, req, uintptr(unsafe.Pointer(&value)))
 | 
				
			||||||
 | 
						return &value, err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * 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	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)
 | 
				
			||||||
 | 
					//sys	Creat(path string, mode uint32) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Dup(fd int) (nfd int, err error)
 | 
				
			||||||
 | 
					//sys	Dup2(oldfd int, newfd int) (err error)
 | 
				
			||||||
 | 
					//sys	Exit(code int)
 | 
				
			||||||
 | 
					//sys	Fchdir(fd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchmod(fd int, mode uint32) (err error)
 | 
				
			||||||
 | 
					//sys	Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchown(fd int, uid int, gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Fdatasync(fd int) (err error)
 | 
				
			||||||
 | 
					//sys	Fpathconf(fd int, name int) (val int, err error)
 | 
				
			||||||
 | 
					//sys	Fstat(fd int, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Getdents(fd int, buf []byte, basep *uintptr) (n int, err error)
 | 
				
			||||||
 | 
					//sysnb	Getgid() (gid int)
 | 
				
			||||||
 | 
					//sysnb	Getpid() (pid int)
 | 
				
			||||||
 | 
					//sysnb	Getpgid(pid int) (pgid int, err error)
 | 
				
			||||||
 | 
					//sysnb	Getpgrp() (pgid int, err error)
 | 
				
			||||||
 | 
					//sys	Geteuid() (euid int)
 | 
				
			||||||
 | 
					//sys	Getegid() (egid int)
 | 
				
			||||||
 | 
					//sys	Getppid() (ppid int)
 | 
				
			||||||
 | 
					//sys	Getpriority(which int, who int) (n int, err error)
 | 
				
			||||||
 | 
					//sysnb	Getrlimit(which int, lim *Rlimit) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getrusage(who int, rusage *Rusage) (err error)
 | 
				
			||||||
 | 
					//sysnb	Gettimeofday(tv *Timeval) (err error)
 | 
				
			||||||
 | 
					//sysnb	Getuid() (uid int)
 | 
				
			||||||
 | 
					//sys	Kill(pid int, signum syscall.Signal) (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) = libsocket.listen
 | 
				
			||||||
 | 
					//sys	Lstat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Madvise(b []byte, advice int) (err error)
 | 
				
			||||||
 | 
					//sys	Mkdir(path string, mode uint32) (err error)
 | 
				
			||||||
 | 
					//sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
 | 
				
			||||||
 | 
					//sys	Mkfifo(path string, mode uint32) (err error)
 | 
				
			||||||
 | 
					//sys	Mkfifoat(dirfd int, path string, mode uint32) (err error)
 | 
				
			||||||
 | 
					//sys	Mknod(path string, mode uint32, dev int) (err error)
 | 
				
			||||||
 | 
					//sys	Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
 | 
				
			||||||
 | 
					//sys	Mlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Mlockall(flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Mprotect(b []byte, prot int) (err error)
 | 
				
			||||||
 | 
					//sys	Munlock(b []byte) (err error)
 | 
				
			||||||
 | 
					//sys	Munlockall() (err error)
 | 
				
			||||||
 | 
					//sys	Nanosleep(time *Timespec, leftover *Timespec) (err error)
 | 
				
			||||||
 | 
					//sys	Open(path string, mode int, perm uint32) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
 | 
				
			||||||
 | 
					//sys	Pathconf(path string, name int) (val int, err error)
 | 
				
			||||||
 | 
					//sys	Pause() (err error)
 | 
				
			||||||
 | 
					//sys	Pread(fd int, p []byte, offset int64) (n int, err error)
 | 
				
			||||||
 | 
					//sys	Pwrite(fd int, p []byte, offset int64) (n 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	Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error)
 | 
				
			||||||
 | 
					//sys	Rmdir(path string) (err error)
 | 
				
			||||||
 | 
					//sys	Seek(fd int, offset int64, whence int) (newoffset int64, err error) = lseek
 | 
				
			||||||
 | 
					//sysnb	Setegid(egid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Seteuid(euid int) (err error)
 | 
				
			||||||
 | 
					//sysnb	Setgid(gid int) (err error)
 | 
				
			||||||
 | 
					//sys	Sethostname(p []byte) (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	Setuid(uid int) (err error)
 | 
				
			||||||
 | 
					//sys	Shutdown(s int, how int) (err error) = libsocket.shutdown
 | 
				
			||||||
 | 
					//sys	Stat(path string, stat *Stat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Symlink(path string, link string) (err error)
 | 
				
			||||||
 | 
					//sys	Sync() (err error)
 | 
				
			||||||
 | 
					//sysnb	Times(tms *Tms) (ticks uintptr, err error)
 | 
				
			||||||
 | 
					//sys	Truncate(path string, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	Fsync(fd int) (err error)
 | 
				
			||||||
 | 
					//sys	Ftruncate(fd int, length int64) (err error)
 | 
				
			||||||
 | 
					//sys	Umask(mask int) (oldmask int)
 | 
				
			||||||
 | 
					//sysnb	Uname(buf *Utsname) (err error)
 | 
				
			||||||
 | 
					//sys	Unmount(target string, flags int) (err error) = libc.umount
 | 
				
			||||||
 | 
					//sys	Unlink(path string) (err error)
 | 
				
			||||||
 | 
					//sys	Unlinkat(dirfd int, path string, flags int) (err error)
 | 
				
			||||||
 | 
					//sys	Ustat(dev int, ubuf *Ustat_t) (err error)
 | 
				
			||||||
 | 
					//sys	Utime(path string, buf *Utimbuf) (err error)
 | 
				
			||||||
 | 
					//sys	bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.bind
 | 
				
			||||||
 | 
					//sys	connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.connect
 | 
				
			||||||
 | 
					//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	sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = libsocket.sendto
 | 
				
			||||||
 | 
					//sys	socket(domain int, typ int, proto int) (fd int, err error) = libsocket.socket
 | 
				
			||||||
 | 
					//sysnb	socketpair(domain int, typ int, proto int, fd *[2]int32) (err error) = libsocket.socketpair
 | 
				
			||||||
 | 
					//sys	write(fd int, p []byte) (n int, err error)
 | 
				
			||||||
 | 
					//sys	getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error) = libsocket.getsockopt
 | 
				
			||||||
 | 
					//sysnb	getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = libsocket.getpeername
 | 
				
			||||||
 | 
					//sys	setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error) = libsocket.setsockopt
 | 
				
			||||||
 | 
					//sys	recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = libsocket.recvfrom
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func readlen(fd int, buf *byte, nbuf int) (n int, err error) {
 | 
				
			||||||
 | 
						r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procread)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)
 | 
				
			||||||
 | 
						n = int(r0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func writelen(fd int, buf *byte, nbuf int) (n int, err error) {
 | 
				
			||||||
 | 
						r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procwrite)), 3, uintptr(fd), uintptr(unsafe.Pointer(buf)), uintptr(nbuf), 0, 0, 0)
 | 
				
			||||||
 | 
						n = int(r0)
 | 
				
			||||||
 | 
						if e1 != 0 {
 | 
				
			||||||
 | 
							err = e1
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var mapper = &mmapper{
 | 
				
			||||||
 | 
						active: make(map[*byte][]byte),
 | 
				
			||||||
 | 
						mmap:   mmap,
 | 
				
			||||||
 | 
						munmap: munmap,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
 | 
				
			||||||
 | 
						return mapper.Mmap(fd, offset, length, prot, flags)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Munmap(b []byte) (err error) {
 | 
				
			||||||
 | 
						return mapper.Munmap(b)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//sys	sysconf(name int) (n int64, err error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// pageSize caches the value of Getpagesize, since it can't change
 | 
				
			||||||
 | 
					// once the system is booted.
 | 
				
			||||||
 | 
					var pageSize int64 // accessed atomically
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpagesize() int {
 | 
				
			||||||
 | 
						n := atomic.LoadInt64(&pageSize)
 | 
				
			||||||
 | 
						if n == 0 {
 | 
				
			||||||
 | 
							n, _ = sysconf(_SC_PAGESIZE)
 | 
				
			||||||
 | 
							atomic.StoreInt64(&pageSize, n)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return int(n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,35 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build amd64,solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimespec(nsec int64) (ts Timespec) {
 | 
				
			||||||
 | 
						ts.Sec = nsec / 1e9
 | 
				
			||||||
 | 
						ts.Nsec = nsec % 1e9
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func NsecToTimeval(nsec int64) (tv Timeval) {
 | 
				
			||||||
 | 
						nsec += 999 // round up to microsecond
 | 
				
			||||||
 | 
						tv.Usec = nsec % 1e9 / 1e3
 | 
				
			||||||
 | 
						tv.Sec = int64(nsec / 1e9)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (iov *Iovec) SetLen(length int) {
 | 
				
			||||||
 | 
						iov.Len = uint64(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (cmsg *Cmsghdr) SetLen(length int) {
 | 
				
			||||||
 | 
						cmsg.Len = uint32(length)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						// TODO(aram): implement this, see issue 5847.
 | 
				
			||||||
 | 
						panic("unimplemented")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,292 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"runtime"
 | 
				
			||||||
 | 
						"sync"
 | 
				
			||||||
 | 
						"syscall"
 | 
				
			||||||
 | 
						"unsafe"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						Stdin  = 0
 | 
				
			||||||
 | 
						Stdout = 1
 | 
				
			||||||
 | 
						Stderr = 2
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						darwin64Bit    = runtime.GOOS == "darwin" && sizeofPtr == 8
 | 
				
			||||||
 | 
						dragonfly64Bit = runtime.GOOS == "dragonfly" && sizeofPtr == 8
 | 
				
			||||||
 | 
						netbsd32Bit    = runtime.GOOS == "netbsd" && sizeofPtr == 4
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Do the interface allocations only once for common
 | 
				
			||||||
 | 
					// Errno values.
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						errEAGAIN error = syscall.EAGAIN
 | 
				
			||||||
 | 
						errEINVAL error = syscall.EINVAL
 | 
				
			||||||
 | 
						errENOENT error = syscall.ENOENT
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// errnoErr returns common boxed Errno values, to prevent
 | 
				
			||||||
 | 
					// allocations at runtime.
 | 
				
			||||||
 | 
					func errnoErr(e syscall.Errno) error {
 | 
				
			||||||
 | 
						switch e {
 | 
				
			||||||
 | 
						case 0:
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						case EAGAIN:
 | 
				
			||||||
 | 
							return errEAGAIN
 | 
				
			||||||
 | 
						case EINVAL:
 | 
				
			||||||
 | 
							return errEINVAL
 | 
				
			||||||
 | 
						case ENOENT:
 | 
				
			||||||
 | 
							return errENOENT
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return e
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Mmap manager, for use by operating system-specific implementations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type mmapper struct {
 | 
				
			||||||
 | 
						sync.Mutex
 | 
				
			||||||
 | 
						active map[*byte][]byte // active mappings; key is last byte in mapping
 | 
				
			||||||
 | 
						mmap   func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
 | 
				
			||||||
 | 
						munmap func(addr uintptr, length uintptr) error
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
 | 
				
			||||||
 | 
						if length <= 0 {
 | 
				
			||||||
 | 
							return nil, EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Map the requested memory.
 | 
				
			||||||
 | 
						addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
 | 
				
			||||||
 | 
						if errno != nil {
 | 
				
			||||||
 | 
							return nil, errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Slice memory layout
 | 
				
			||||||
 | 
						var sl = struct {
 | 
				
			||||||
 | 
							addr uintptr
 | 
				
			||||||
 | 
							len  int
 | 
				
			||||||
 | 
							cap  int
 | 
				
			||||||
 | 
						}{addr, length, length}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Use unsafe to turn sl into a []byte.
 | 
				
			||||||
 | 
						b := *(*[]byte)(unsafe.Pointer(&sl))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Register mapping in m and return it.
 | 
				
			||||||
 | 
						p := &b[cap(b)-1]
 | 
				
			||||||
 | 
						m.Lock()
 | 
				
			||||||
 | 
						defer m.Unlock()
 | 
				
			||||||
 | 
						m.active[p] = b
 | 
				
			||||||
 | 
						return b, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (m *mmapper) Munmap(data []byte) (err error) {
 | 
				
			||||||
 | 
						if len(data) == 0 || len(data) != cap(data) {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Find the base of the mapping.
 | 
				
			||||||
 | 
						p := &data[cap(data)-1]
 | 
				
			||||||
 | 
						m.Lock()
 | 
				
			||||||
 | 
						defer m.Unlock()
 | 
				
			||||||
 | 
						b := m.active[p]
 | 
				
			||||||
 | 
						if b == nil || &b[0] != &data[0] {
 | 
				
			||||||
 | 
							return EINVAL
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Unmap the memory and update m.
 | 
				
			||||||
 | 
						if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
 | 
				
			||||||
 | 
							return errno
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						delete(m.active, p)
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Read(fd int, p []byte) (n int, err error) {
 | 
				
			||||||
 | 
						n, err = read(fd, p)
 | 
				
			||||||
 | 
						if raceenabled {
 | 
				
			||||||
 | 
							if n > 0 {
 | 
				
			||||||
 | 
								raceWriteRange(unsafe.Pointer(&p[0]), n)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if err == nil {
 | 
				
			||||||
 | 
								raceAcquire(unsafe.Pointer(&ioSync))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Write(fd int, p []byte) (n int, err error) {
 | 
				
			||||||
 | 
						if raceenabled {
 | 
				
			||||||
 | 
							raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						n, err = write(fd, p)
 | 
				
			||||||
 | 
						if raceenabled && n > 0 {
 | 
				
			||||||
 | 
							raceReadRange(unsafe.Pointer(&p[0]), n)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// For testing: clients can set this flag to force
 | 
				
			||||||
 | 
					// creation of IPv6 sockets to return EAFNOSUPPORT.
 | 
				
			||||||
 | 
					var SocketDisableIPv6 bool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Sockaddr interface {
 | 
				
			||||||
 | 
						sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrInet4 struct {
 | 
				
			||||||
 | 
						Port int
 | 
				
			||||||
 | 
						Addr [4]byte
 | 
				
			||||||
 | 
						raw  RawSockaddrInet4
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrInet6 struct {
 | 
				
			||||||
 | 
						Port   int
 | 
				
			||||||
 | 
						ZoneId uint32
 | 
				
			||||||
 | 
						Addr   [16]byte
 | 
				
			||||||
 | 
						raw    RawSockaddrInet6
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SockaddrUnix struct {
 | 
				
			||||||
 | 
						Name string
 | 
				
			||||||
 | 
						raw  RawSockaddrUnix
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Bind(fd int, sa Sockaddr) (err error) {
 | 
				
			||||||
 | 
						ptr, n, err := sa.sockaddr()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return bind(fd, ptr, n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Connect(fd int, sa Sockaddr) (err error) {
 | 
				
			||||||
 | 
						ptr, n, err := sa.sockaddr()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return connect(fd, ptr, n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Getpeername(fd int) (sa Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						if err = getpeername(fd, &rsa, &len); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func GetsockoptInt(fd, level, opt int) (value int, err error) {
 | 
				
			||||||
 | 
						var n int32
 | 
				
			||||||
 | 
						vallen := _Socklen(4)
 | 
				
			||||||
 | 
						err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
 | 
				
			||||||
 | 
						return int(n), err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
 | 
				
			||||||
 | 
						var rsa RawSockaddrAny
 | 
				
			||||||
 | 
						var len _Socklen = SizeofSockaddrAny
 | 
				
			||||||
 | 
						if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rsa.Addr.Family != AF_UNSPEC {
 | 
				
			||||||
 | 
							from, err = anyToSockaddr(&rsa)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
 | 
				
			||||||
 | 
						ptr, n, err := to.sockaddr()
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sendto(fd, p, flags, ptr, n)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptByte(fd, level, opt int, value byte) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptInt(fd, level, opt int, value int) (err error) {
 | 
				
			||||||
 | 
						var n = int32(value)
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptString(fd, level, opt int, s string) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(&[]byte(s)[0]), uintptr(len(s)))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
 | 
				
			||||||
 | 
						return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Socket(domain, typ, proto int) (fd int, err error) {
 | 
				
			||||||
 | 
						if domain == AF_INET6 && SocketDisableIPv6 {
 | 
				
			||||||
 | 
							return -1, EAFNOSUPPORT
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fd, err = socket(domain, typ, proto)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
 | 
				
			||||||
 | 
						var fdx [2]int32
 | 
				
			||||||
 | 
						err = socketpair(domain, typ, proto, &fdx)
 | 
				
			||||||
 | 
						if err == nil {
 | 
				
			||||||
 | 
							fd[0] = int(fdx[0])
 | 
				
			||||||
 | 
							fd[1] = int(fdx[1])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
 | 
				
			||||||
 | 
						if raceenabled {
 | 
				
			||||||
 | 
							raceReleaseMerge(unsafe.Pointer(&ioSync))
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sendfile(outfd, infd, offset, count)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var ioSync int64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func SetNonblock(fd int, nonblocking bool) (err error) {
 | 
				
			||||||
 | 
						flag, err := fcntl(fd, F_GETFL, 0)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if nonblocking {
 | 
				
			||||||
 | 
							flag |= O_NONBLOCK
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							flag &= ^O_NONBLOCK
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						_, err = fcntl(fd, F_SETFL, flag)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,15 @@
 | 
				
			||||||
 | 
					// Copyright 2016 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 | 
				
			||||||
 | 
					// +build !gccgo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "syscall"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
 | 
					func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err syscall.Errno)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,250 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Input to cgo -godefs.  See README.md
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +godefs map struct_in_addr [4]byte /* in_addr */
 | 
				
			||||||
 | 
					// +godefs map struct_in6_addr [16]byte /* in6_addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define __DARWIN_UNIX03 0
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#define _DARWIN_USE_64_BIT_INODE
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <mach/mach.h>
 | 
				
			||||||
 | 
					#include <mach/message.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/uio.h>
 | 
				
			||||||
 | 
					#include <sys/un.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_dl.h>
 | 
				
			||||||
 | 
					#include <net/if_var.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/icmp6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						sizeofPtr = sizeof(void*),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union sockaddr_all {
 | 
				
			||||||
 | 
						struct sockaddr s1;	// this one gets used for fields
 | 
				
			||||||
 | 
						struct sockaddr_in s2;	// these pad it out
 | 
				
			||||||
 | 
						struct sockaddr_in6 s3;
 | 
				
			||||||
 | 
						struct sockaddr_un s4;
 | 
				
			||||||
 | 
						struct sockaddr_dl s5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sockaddr_any {
 | 
				
			||||||
 | 
						struct sockaddr addr;
 | 
				
			||||||
 | 
						char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Machine characteristics; for internal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofPtr      = C.sizeofPtr
 | 
				
			||||||
 | 
						sizeofShort    = C.sizeof_short
 | 
				
			||||||
 | 
						sizeofInt      = C.sizeof_int
 | 
				
			||||||
 | 
						sizeofLong     = C.sizeof_long
 | 
				
			||||||
 | 
						sizeofLongLong = C.sizeof_longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Basic types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						_C_short     C.short
 | 
				
			||||||
 | 
						_C_int       C.int
 | 
				
			||||||
 | 
						_C_long      C.long
 | 
				
			||||||
 | 
						_C_long_long C.longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timespec C.struct_timespec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval C.struct_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval32 C.struct_timeval32
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rusage C.struct_rusage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rlimit C.struct_rlimit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Gid_t C.gid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Stat_t C.struct_stat64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Statfs_t C.struct_statfs64
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Flock_t C.struct_flock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fstore_t C.struct_fstore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Radvisory_t C.struct_radvisory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fbootstraptransfer_t C.struct_fbootstraptransfer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Log2phys_t C.struct_log2phys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fsid C.struct_fsid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Dirent C.struct_dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sockets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet4 C.struct_sockaddr_in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet6 C.struct_sockaddr_in6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrUnix C.struct_sockaddr_un
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrDatalink C.struct_sockaddr_dl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddr C.struct_sockaddr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrAny C.struct_sockaddr_any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Socklen C.socklen_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Linger C.struct_linger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Iovec C.struct_iovec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreq C.struct_ip_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6Mreq C.struct_ipv6_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Msghdr C.struct_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Cmsghdr C.struct_cmsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet4Pktinfo C.struct_in_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet6Pktinfo C.struct_in6_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6MTUInfo C.struct_ip6_mtuinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ICMPv6Filter C.struct_icmp6_filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in
 | 
				
			||||||
 | 
						SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6
 | 
				
			||||||
 | 
						SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any
 | 
				
			||||||
 | 
						SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un
 | 
				
			||||||
 | 
						SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
 | 
				
			||||||
 | 
						SizeofLinger           = C.sizeof_struct_linger
 | 
				
			||||||
 | 
						SizeofIPMreq           = C.sizeof_struct_ip_mreq
 | 
				
			||||||
 | 
						SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq
 | 
				
			||||||
 | 
						SizeofMsghdr           = C.sizeof_struct_msghdr
 | 
				
			||||||
 | 
						SizeofCmsghdr          = C.sizeof_struct_cmsghdr
 | 
				
			||||||
 | 
						SizeofInet4Pktinfo     = C.sizeof_struct_in_pktinfo
 | 
				
			||||||
 | 
						SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo
 | 
				
			||||||
 | 
						SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo
 | 
				
			||||||
 | 
						SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ptrace requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						PTRACE_TRACEME = C.PT_TRACE_ME
 | 
				
			||||||
 | 
						PTRACE_CONT    = C.PT_CONTINUE
 | 
				
			||||||
 | 
						PTRACE_KILL    = C.PT_KILL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Events (kqueue, kevent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Kevent_t C.struct_kevent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FdSet C.fd_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Routing and interface messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofIfMsghdr    = C.sizeof_struct_if_msghdr
 | 
				
			||||||
 | 
						SizeofIfData      = C.sizeof_struct_if_data
 | 
				
			||||||
 | 
						SizeofIfaMsghdr   = C.sizeof_struct_ifa_msghdr
 | 
				
			||||||
 | 
						SizeofIfmaMsghdr  = C.sizeof_struct_ifma_msghdr
 | 
				
			||||||
 | 
						SizeofIfmaMsghdr2 = C.sizeof_struct_ifma_msghdr2
 | 
				
			||||||
 | 
						SizeofRtMsghdr    = C.sizeof_struct_rt_msghdr
 | 
				
			||||||
 | 
						SizeofRtMetrics   = C.sizeof_struct_rt_metrics
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfMsghdr C.struct_if_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfData C.struct_if_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfaMsghdr C.struct_ifa_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfmaMsghdr C.struct_ifma_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfmaMsghdr2 C.struct_ifma_msghdr2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMsghdr C.struct_rt_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMetrics C.struct_rt_metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Berkeley packet filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofBpfVersion = C.sizeof_struct_bpf_version
 | 
				
			||||||
 | 
						SizeofBpfStat    = C.sizeof_struct_bpf_stat
 | 
				
			||||||
 | 
						SizeofBpfProgram = C.sizeof_struct_bpf_program
 | 
				
			||||||
 | 
						SizeofBpfInsn    = C.sizeof_struct_bpf_insn
 | 
				
			||||||
 | 
						SizeofBpfHdr     = C.sizeof_struct_bpf_hdr
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfVersion C.struct_bpf_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfStat C.struct_bpf_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfProgram C.struct_bpf_program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfInsn C.struct_bpf_insn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfHdr C.struct_bpf_hdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Terminal handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios C.struct_termios
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fchmodat-like syscalls.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						AT_FDCWD            = C.AT_FDCWD
 | 
				
			||||||
 | 
						AT_SYMLINK_NOFOLLOW = C.AT_SYMLINK_NOFOLLOW
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,242 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Input to cgo -godefs.  See README.md
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +godefs map struct_in_addr [4]byte /* in_addr */
 | 
				
			||||||
 | 
					// +godefs map struct_in6_addr [16]byte /* in6_addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/un.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_dl.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/icmp6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						sizeofPtr = sizeof(void*),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union sockaddr_all {
 | 
				
			||||||
 | 
						struct sockaddr s1;	// this one gets used for fields
 | 
				
			||||||
 | 
						struct sockaddr_in s2;	// these pad it out
 | 
				
			||||||
 | 
						struct sockaddr_in6 s3;
 | 
				
			||||||
 | 
						struct sockaddr_un s4;
 | 
				
			||||||
 | 
						struct sockaddr_dl s5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sockaddr_any {
 | 
				
			||||||
 | 
						struct sockaddr addr;
 | 
				
			||||||
 | 
						char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Machine characteristics; for internal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofPtr      = C.sizeofPtr
 | 
				
			||||||
 | 
						sizeofShort    = C.sizeof_short
 | 
				
			||||||
 | 
						sizeofInt      = C.sizeof_int
 | 
				
			||||||
 | 
						sizeofLong     = C.sizeof_long
 | 
				
			||||||
 | 
						sizeofLongLong = C.sizeof_longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Basic types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						_C_short     C.short
 | 
				
			||||||
 | 
						_C_int       C.int
 | 
				
			||||||
 | 
						_C_long      C.long
 | 
				
			||||||
 | 
						_C_long_long C.longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timespec C.struct_timespec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval C.struct_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rusage C.struct_rusage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rlimit C.struct_rlimit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Gid_t C.gid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ( // Directory mode bits
 | 
				
			||||||
 | 
						S_IFMT   = C.S_IFMT
 | 
				
			||||||
 | 
						S_IFIFO  = C.S_IFIFO
 | 
				
			||||||
 | 
						S_IFCHR  = C.S_IFCHR
 | 
				
			||||||
 | 
						S_IFDIR  = C.S_IFDIR
 | 
				
			||||||
 | 
						S_IFBLK  = C.S_IFBLK
 | 
				
			||||||
 | 
						S_IFREG  = C.S_IFREG
 | 
				
			||||||
 | 
						S_IFLNK  = C.S_IFLNK
 | 
				
			||||||
 | 
						S_IFSOCK = C.S_IFSOCK
 | 
				
			||||||
 | 
						S_ISUID  = C.S_ISUID
 | 
				
			||||||
 | 
						S_ISGID  = C.S_ISGID
 | 
				
			||||||
 | 
						S_ISVTX  = C.S_ISVTX
 | 
				
			||||||
 | 
						S_IRUSR  = C.S_IRUSR
 | 
				
			||||||
 | 
						S_IWUSR  = C.S_IWUSR
 | 
				
			||||||
 | 
						S_IXUSR  = C.S_IXUSR
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Stat_t C.struct_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Statfs_t C.struct_statfs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Flock_t C.struct_flock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Dirent C.struct_dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fsid C.struct_fsid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sockets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet4 C.struct_sockaddr_in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet6 C.struct_sockaddr_in6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrUnix C.struct_sockaddr_un
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrDatalink C.struct_sockaddr_dl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddr C.struct_sockaddr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrAny C.struct_sockaddr_any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Socklen C.socklen_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Linger C.struct_linger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Iovec C.struct_iovec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreq C.struct_ip_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6Mreq C.struct_ipv6_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Msghdr C.struct_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Cmsghdr C.struct_cmsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet6Pktinfo C.struct_in6_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6MTUInfo C.struct_ip6_mtuinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ICMPv6Filter C.struct_icmp6_filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in
 | 
				
			||||||
 | 
						SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6
 | 
				
			||||||
 | 
						SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any
 | 
				
			||||||
 | 
						SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un
 | 
				
			||||||
 | 
						SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
 | 
				
			||||||
 | 
						SizeofLinger           = C.sizeof_struct_linger
 | 
				
			||||||
 | 
						SizeofIPMreq           = C.sizeof_struct_ip_mreq
 | 
				
			||||||
 | 
						SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq
 | 
				
			||||||
 | 
						SizeofMsghdr           = C.sizeof_struct_msghdr
 | 
				
			||||||
 | 
						SizeofCmsghdr          = C.sizeof_struct_cmsghdr
 | 
				
			||||||
 | 
						SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo
 | 
				
			||||||
 | 
						SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo
 | 
				
			||||||
 | 
						SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ptrace requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						PTRACE_TRACEME = C.PT_TRACE_ME
 | 
				
			||||||
 | 
						PTRACE_CONT    = C.PT_CONTINUE
 | 
				
			||||||
 | 
						PTRACE_KILL    = C.PT_KILL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Events (kqueue, kevent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Kevent_t C.struct_kevent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FdSet C.fd_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Routing and interface messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofIfMsghdr         = C.sizeof_struct_if_msghdr
 | 
				
			||||||
 | 
						SizeofIfData           = C.sizeof_struct_if_data
 | 
				
			||||||
 | 
						SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr
 | 
				
			||||||
 | 
						SizeofIfmaMsghdr       = C.sizeof_struct_ifma_msghdr
 | 
				
			||||||
 | 
						SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr
 | 
				
			||||||
 | 
						SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr
 | 
				
			||||||
 | 
						SizeofRtMetrics        = C.sizeof_struct_rt_metrics
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfMsghdr C.struct_if_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfData C.struct_if_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfaMsghdr C.struct_ifa_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfmaMsghdr C.struct_ifma_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfAnnounceMsghdr C.struct_if_announcemsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMsghdr C.struct_rt_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMetrics C.struct_rt_metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Berkeley packet filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofBpfVersion = C.sizeof_struct_bpf_version
 | 
				
			||||||
 | 
						SizeofBpfStat    = C.sizeof_struct_bpf_stat
 | 
				
			||||||
 | 
						SizeofBpfProgram = C.sizeof_struct_bpf_program
 | 
				
			||||||
 | 
						SizeofBpfInsn    = C.sizeof_struct_bpf_insn
 | 
				
			||||||
 | 
						SizeofBpfHdr     = C.sizeof_struct_bpf_hdr
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfVersion C.struct_bpf_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfStat C.struct_bpf_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfProgram C.struct_bpf_program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfInsn C.struct_bpf_insn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfHdr C.struct_bpf_hdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Terminal handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios C.struct_termios
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,353 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Input to cgo -godefs.  See README.md
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +godefs map struct_in_addr [4]byte /* in_addr */
 | 
				
			||||||
 | 
					// +godefs map struct_in6_addr [16]byte /* in6_addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/un.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_dl.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/icmp6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						sizeofPtr = sizeof(void*),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union sockaddr_all {
 | 
				
			||||||
 | 
						struct sockaddr s1;	// this one gets used for fields
 | 
				
			||||||
 | 
						struct sockaddr_in s2;	// these pad it out
 | 
				
			||||||
 | 
						struct sockaddr_in6 s3;
 | 
				
			||||||
 | 
						struct sockaddr_un s4;
 | 
				
			||||||
 | 
						struct sockaddr_dl s5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sockaddr_any {
 | 
				
			||||||
 | 
						struct sockaddr addr;
 | 
				
			||||||
 | 
						char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This structure is a duplicate of stat on FreeBSD 8-STABLE.
 | 
				
			||||||
 | 
					// See /usr/include/sys/stat.h.
 | 
				
			||||||
 | 
					struct stat8 {
 | 
				
			||||||
 | 
					#undef st_atimespec	st_atim
 | 
				
			||||||
 | 
					#undef st_mtimespec	st_mtim
 | 
				
			||||||
 | 
					#undef st_ctimespec	st_ctim
 | 
				
			||||||
 | 
					#undef st_birthtimespec	st_birthtim
 | 
				
			||||||
 | 
						__dev_t   st_dev;
 | 
				
			||||||
 | 
						ino_t     st_ino;
 | 
				
			||||||
 | 
						mode_t    st_mode;
 | 
				
			||||||
 | 
						nlink_t   st_nlink;
 | 
				
			||||||
 | 
						uid_t     st_uid;
 | 
				
			||||||
 | 
						gid_t     st_gid;
 | 
				
			||||||
 | 
						__dev_t   st_rdev;
 | 
				
			||||||
 | 
					#if __BSD_VISIBLE
 | 
				
			||||||
 | 
						struct  timespec st_atimespec;
 | 
				
			||||||
 | 
						struct  timespec st_mtimespec;
 | 
				
			||||||
 | 
						struct  timespec st_ctimespec;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						time_t    st_atime;
 | 
				
			||||||
 | 
						long      __st_atimensec;
 | 
				
			||||||
 | 
						time_t    st_mtime;
 | 
				
			||||||
 | 
						long      __st_mtimensec;
 | 
				
			||||||
 | 
						time_t    st_ctime;
 | 
				
			||||||
 | 
						long      __st_ctimensec;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						off_t     st_size;
 | 
				
			||||||
 | 
						blkcnt_t st_blocks;
 | 
				
			||||||
 | 
						blksize_t st_blksize;
 | 
				
			||||||
 | 
						fflags_t  st_flags;
 | 
				
			||||||
 | 
						__uint32_t st_gen;
 | 
				
			||||||
 | 
						__int32_t st_lspare;
 | 
				
			||||||
 | 
					#if __BSD_VISIBLE
 | 
				
			||||||
 | 
						struct timespec st_birthtimespec;
 | 
				
			||||||
 | 
						unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec));
 | 
				
			||||||
 | 
						unsigned int :(8 / 2) * (16 - (int)sizeof(struct timespec));
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						time_t    st_birthtime;
 | 
				
			||||||
 | 
						long      st_birthtimensec;
 | 
				
			||||||
 | 
						unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec));
 | 
				
			||||||
 | 
						unsigned int :(8 / 2) * (16 - (int)sizeof(struct __timespec));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This structure is a duplicate of if_data on FreeBSD 8-STABLE.
 | 
				
			||||||
 | 
					// See /usr/include/net/if.h.
 | 
				
			||||||
 | 
					struct if_data8 {
 | 
				
			||||||
 | 
						u_char  ifi_type;
 | 
				
			||||||
 | 
						u_char  ifi_physical;
 | 
				
			||||||
 | 
						u_char  ifi_addrlen;
 | 
				
			||||||
 | 
						u_char  ifi_hdrlen;
 | 
				
			||||||
 | 
						u_char  ifi_link_state;
 | 
				
			||||||
 | 
						u_char  ifi_spare_char1;
 | 
				
			||||||
 | 
						u_char  ifi_spare_char2;
 | 
				
			||||||
 | 
						u_char  ifi_datalen;
 | 
				
			||||||
 | 
						u_long  ifi_mtu;
 | 
				
			||||||
 | 
						u_long  ifi_metric;
 | 
				
			||||||
 | 
						u_long  ifi_baudrate;
 | 
				
			||||||
 | 
						u_long  ifi_ipackets;
 | 
				
			||||||
 | 
						u_long  ifi_ierrors;
 | 
				
			||||||
 | 
						u_long  ifi_opackets;
 | 
				
			||||||
 | 
						u_long  ifi_oerrors;
 | 
				
			||||||
 | 
						u_long  ifi_collisions;
 | 
				
			||||||
 | 
						u_long  ifi_ibytes;
 | 
				
			||||||
 | 
						u_long  ifi_obytes;
 | 
				
			||||||
 | 
						u_long  ifi_imcasts;
 | 
				
			||||||
 | 
						u_long  ifi_omcasts;
 | 
				
			||||||
 | 
						u_long  ifi_iqdrops;
 | 
				
			||||||
 | 
						u_long  ifi_noproto;
 | 
				
			||||||
 | 
						u_long  ifi_hwassist;
 | 
				
			||||||
 | 
						time_t  ifi_epoch;
 | 
				
			||||||
 | 
						struct  timeval ifi_lastchange;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// This structure is a duplicate of if_msghdr on FreeBSD 8-STABLE.
 | 
				
			||||||
 | 
					// See /usr/include/net/if.h.
 | 
				
			||||||
 | 
					struct if_msghdr8 {
 | 
				
			||||||
 | 
						u_short ifm_msglen;
 | 
				
			||||||
 | 
						u_char  ifm_version;
 | 
				
			||||||
 | 
						u_char  ifm_type;
 | 
				
			||||||
 | 
						int     ifm_addrs;
 | 
				
			||||||
 | 
						int     ifm_flags;
 | 
				
			||||||
 | 
						u_short ifm_index;
 | 
				
			||||||
 | 
						struct  if_data8 ifm_data;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Machine characteristics; for internal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofPtr      = C.sizeofPtr
 | 
				
			||||||
 | 
						sizeofShort    = C.sizeof_short
 | 
				
			||||||
 | 
						sizeofInt      = C.sizeof_int
 | 
				
			||||||
 | 
						sizeofLong     = C.sizeof_long
 | 
				
			||||||
 | 
						sizeofLongLong = C.sizeof_longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Basic types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						_C_short     C.short
 | 
				
			||||||
 | 
						_C_int       C.int
 | 
				
			||||||
 | 
						_C_long      C.long
 | 
				
			||||||
 | 
						_C_long_long C.longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timespec C.struct_timespec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval C.struct_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rusage C.struct_rusage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rlimit C.struct_rlimit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Gid_t C.gid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ( // Directory mode bits
 | 
				
			||||||
 | 
						S_IFMT   = C.S_IFMT
 | 
				
			||||||
 | 
						S_IFIFO  = C.S_IFIFO
 | 
				
			||||||
 | 
						S_IFCHR  = C.S_IFCHR
 | 
				
			||||||
 | 
						S_IFDIR  = C.S_IFDIR
 | 
				
			||||||
 | 
						S_IFBLK  = C.S_IFBLK
 | 
				
			||||||
 | 
						S_IFREG  = C.S_IFREG
 | 
				
			||||||
 | 
						S_IFLNK  = C.S_IFLNK
 | 
				
			||||||
 | 
						S_IFSOCK = C.S_IFSOCK
 | 
				
			||||||
 | 
						S_ISUID  = C.S_ISUID
 | 
				
			||||||
 | 
						S_ISGID  = C.S_ISGID
 | 
				
			||||||
 | 
						S_ISVTX  = C.S_ISVTX
 | 
				
			||||||
 | 
						S_IRUSR  = C.S_IRUSR
 | 
				
			||||||
 | 
						S_IWUSR  = C.S_IWUSR
 | 
				
			||||||
 | 
						S_IXUSR  = C.S_IXUSR
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Stat_t C.struct_stat8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Statfs_t C.struct_statfs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Flock_t C.struct_flock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Dirent C.struct_dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fsid C.struct_fsid
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Advice to Fadvise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						FADV_NORMAL     = C.POSIX_FADV_NORMAL
 | 
				
			||||||
 | 
						FADV_RANDOM     = C.POSIX_FADV_RANDOM
 | 
				
			||||||
 | 
						FADV_SEQUENTIAL = C.POSIX_FADV_SEQUENTIAL
 | 
				
			||||||
 | 
						FADV_WILLNEED   = C.POSIX_FADV_WILLNEED
 | 
				
			||||||
 | 
						FADV_DONTNEED   = C.POSIX_FADV_DONTNEED
 | 
				
			||||||
 | 
						FADV_NOREUSE    = C.POSIX_FADV_NOREUSE
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sockets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet4 C.struct_sockaddr_in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet6 C.struct_sockaddr_in6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrUnix C.struct_sockaddr_un
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrDatalink C.struct_sockaddr_dl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddr C.struct_sockaddr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrAny C.struct_sockaddr_any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Socklen C.socklen_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Linger C.struct_linger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Iovec C.struct_iovec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreq C.struct_ip_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreqn C.struct_ip_mreqn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6Mreq C.struct_ipv6_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Msghdr C.struct_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Cmsghdr C.struct_cmsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet6Pktinfo C.struct_in6_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6MTUInfo C.struct_ip6_mtuinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ICMPv6Filter C.struct_icmp6_filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in
 | 
				
			||||||
 | 
						SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6
 | 
				
			||||||
 | 
						SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any
 | 
				
			||||||
 | 
						SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un
 | 
				
			||||||
 | 
						SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
 | 
				
			||||||
 | 
						SizeofLinger           = C.sizeof_struct_linger
 | 
				
			||||||
 | 
						SizeofIPMreq           = C.sizeof_struct_ip_mreq
 | 
				
			||||||
 | 
						SizeofIPMreqn          = C.sizeof_struct_ip_mreqn
 | 
				
			||||||
 | 
						SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq
 | 
				
			||||||
 | 
						SizeofMsghdr           = C.sizeof_struct_msghdr
 | 
				
			||||||
 | 
						SizeofCmsghdr          = C.sizeof_struct_cmsghdr
 | 
				
			||||||
 | 
						SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo
 | 
				
			||||||
 | 
						SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo
 | 
				
			||||||
 | 
						SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ptrace requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						PTRACE_TRACEME = C.PT_TRACE_ME
 | 
				
			||||||
 | 
						PTRACE_CONT    = C.PT_CONTINUE
 | 
				
			||||||
 | 
						PTRACE_KILL    = C.PT_KILL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Events (kqueue, kevent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Kevent_t C.struct_kevent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FdSet C.fd_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Routing and interface messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofIfMsghdr         = C.sizeof_struct_if_msghdr
 | 
				
			||||||
 | 
						SizeofIfMsghdr         = C.sizeof_struct_if_msghdr8
 | 
				
			||||||
 | 
						sizeofIfData           = C.sizeof_struct_if_data
 | 
				
			||||||
 | 
						SizeofIfData           = C.sizeof_struct_if_data8
 | 
				
			||||||
 | 
						SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr
 | 
				
			||||||
 | 
						SizeofIfmaMsghdr       = C.sizeof_struct_ifma_msghdr
 | 
				
			||||||
 | 
						SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr
 | 
				
			||||||
 | 
						SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr
 | 
				
			||||||
 | 
						SizeofRtMetrics        = C.sizeof_struct_rt_metrics
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ifMsghdr C.struct_if_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfMsghdr C.struct_if_msghdr8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ifData C.struct_if_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfData C.struct_if_data8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfaMsghdr C.struct_ifa_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfmaMsghdr C.struct_ifma_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfAnnounceMsghdr C.struct_if_announcemsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMsghdr C.struct_rt_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMetrics C.struct_rt_metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Berkeley packet filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofBpfVersion    = C.sizeof_struct_bpf_version
 | 
				
			||||||
 | 
						SizeofBpfStat       = C.sizeof_struct_bpf_stat
 | 
				
			||||||
 | 
						SizeofBpfZbuf       = C.sizeof_struct_bpf_zbuf
 | 
				
			||||||
 | 
						SizeofBpfProgram    = C.sizeof_struct_bpf_program
 | 
				
			||||||
 | 
						SizeofBpfInsn       = C.sizeof_struct_bpf_insn
 | 
				
			||||||
 | 
						SizeofBpfHdr        = C.sizeof_struct_bpf_hdr
 | 
				
			||||||
 | 
						SizeofBpfZbufHeader = C.sizeof_struct_bpf_zbuf_header
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfVersion C.struct_bpf_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfStat C.struct_bpf_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfZbuf C.struct_bpf_zbuf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfProgram C.struct_bpf_program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfInsn C.struct_bpf_insn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfHdr C.struct_bpf_hdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfZbufHeader C.struct_bpf_zbuf_header
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Terminal handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios C.struct_termios
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,232 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Input to cgo -godefs.  See README.md
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +godefs map struct_in_addr [4]byte /* in_addr */
 | 
				
			||||||
 | 
					// +godefs map struct_in6_addr [16]byte /* in6_addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/sysctl.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/uio.h>
 | 
				
			||||||
 | 
					#include <sys/un.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_dl.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/icmp6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						sizeofPtr = sizeof(void*),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union sockaddr_all {
 | 
				
			||||||
 | 
						struct sockaddr s1;	// this one gets used for fields
 | 
				
			||||||
 | 
						struct sockaddr_in s2;	// these pad it out
 | 
				
			||||||
 | 
						struct sockaddr_in6 s3;
 | 
				
			||||||
 | 
						struct sockaddr_un s4;
 | 
				
			||||||
 | 
						struct sockaddr_dl s5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sockaddr_any {
 | 
				
			||||||
 | 
						struct sockaddr addr;
 | 
				
			||||||
 | 
						char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Machine characteristics; for internal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofPtr      = C.sizeofPtr
 | 
				
			||||||
 | 
						sizeofShort    = C.sizeof_short
 | 
				
			||||||
 | 
						sizeofInt      = C.sizeof_int
 | 
				
			||||||
 | 
						sizeofLong     = C.sizeof_long
 | 
				
			||||||
 | 
						sizeofLongLong = C.sizeof_longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Basic types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						_C_short     C.short
 | 
				
			||||||
 | 
						_C_int       C.int
 | 
				
			||||||
 | 
						_C_long      C.long
 | 
				
			||||||
 | 
						_C_long_long C.longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timespec C.struct_timespec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval C.struct_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rusage C.struct_rusage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rlimit C.struct_rlimit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Gid_t C.gid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Stat_t C.struct_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Statfs_t C.struct_statfs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Flock_t C.struct_flock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Dirent C.struct_dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fsid C.fsid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sockets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet4 C.struct_sockaddr_in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet6 C.struct_sockaddr_in6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrUnix C.struct_sockaddr_un
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrDatalink C.struct_sockaddr_dl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddr C.struct_sockaddr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrAny C.struct_sockaddr_any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Socklen C.socklen_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Linger C.struct_linger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Iovec C.struct_iovec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreq C.struct_ip_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6Mreq C.struct_ipv6_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Msghdr C.struct_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Cmsghdr C.struct_cmsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet6Pktinfo C.struct_in6_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6MTUInfo C.struct_ip6_mtuinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ICMPv6Filter C.struct_icmp6_filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in
 | 
				
			||||||
 | 
						SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6
 | 
				
			||||||
 | 
						SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any
 | 
				
			||||||
 | 
						SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un
 | 
				
			||||||
 | 
						SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
 | 
				
			||||||
 | 
						SizeofLinger           = C.sizeof_struct_linger
 | 
				
			||||||
 | 
						SizeofIPMreq           = C.sizeof_struct_ip_mreq
 | 
				
			||||||
 | 
						SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq
 | 
				
			||||||
 | 
						SizeofMsghdr           = C.sizeof_struct_msghdr
 | 
				
			||||||
 | 
						SizeofCmsghdr          = C.sizeof_struct_cmsghdr
 | 
				
			||||||
 | 
						SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo
 | 
				
			||||||
 | 
						SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo
 | 
				
			||||||
 | 
						SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ptrace requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						PTRACE_TRACEME = C.PT_TRACE_ME
 | 
				
			||||||
 | 
						PTRACE_CONT    = C.PT_CONTINUE
 | 
				
			||||||
 | 
						PTRACE_KILL    = C.PT_KILL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Events (kqueue, kevent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Kevent_t C.struct_kevent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FdSet C.fd_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Routing and interface messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofIfMsghdr         = C.sizeof_struct_if_msghdr
 | 
				
			||||||
 | 
						SizeofIfData           = C.sizeof_struct_if_data
 | 
				
			||||||
 | 
						SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr
 | 
				
			||||||
 | 
						SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr
 | 
				
			||||||
 | 
						SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr
 | 
				
			||||||
 | 
						SizeofRtMetrics        = C.sizeof_struct_rt_metrics
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfMsghdr C.struct_if_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfData C.struct_if_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfaMsghdr C.struct_ifa_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfAnnounceMsghdr C.struct_if_announcemsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMsghdr C.struct_rt_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMetrics C.struct_rt_metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Mclpool C.struct_mclpool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Berkeley packet filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofBpfVersion = C.sizeof_struct_bpf_version
 | 
				
			||||||
 | 
						SizeofBpfStat    = C.sizeof_struct_bpf_stat
 | 
				
			||||||
 | 
						SizeofBpfProgram = C.sizeof_struct_bpf_program
 | 
				
			||||||
 | 
						SizeofBpfInsn    = C.sizeof_struct_bpf_insn
 | 
				
			||||||
 | 
						SizeofBpfHdr     = C.sizeof_struct_bpf_hdr
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfVersion C.struct_bpf_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfStat C.struct_bpf_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfProgram C.struct_bpf_program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfInsn C.struct_bpf_insn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfHdr C.struct_bpf_hdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfTimeval C.struct_bpf_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Terminal handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios C.struct_termios
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sysctl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Sysctlnode C.struct_sysctlnode
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,244 @@
 | 
				
			||||||
 | 
					// Copyright 2009 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +build ignore
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Input to cgo -godefs.  See README.md
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// +godefs map struct_in_addr [4]byte /* in_addr */
 | 
				
			||||||
 | 
					// +godefs map struct_in6_addr [16]byte /* in6_addr */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package unix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					#define KERNEL
 | 
				
			||||||
 | 
					#include <dirent.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
 | 
					#include <termios.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <sys/event.h>
 | 
				
			||||||
 | 
					#include <sys/mman.h>
 | 
				
			||||||
 | 
					#include <sys/mount.h>
 | 
				
			||||||
 | 
					#include <sys/ptrace.h>
 | 
				
			||||||
 | 
					#include <sys/resource.h>
 | 
				
			||||||
 | 
					#include <sys/select.h>
 | 
				
			||||||
 | 
					#include <sys/signal.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					#include <sys/stat.h>
 | 
				
			||||||
 | 
					#include <sys/time.h>
 | 
				
			||||||
 | 
					#include <sys/uio.h>
 | 
				
			||||||
 | 
					#include <sys/un.h>
 | 
				
			||||||
 | 
					#include <sys/wait.h>
 | 
				
			||||||
 | 
					#include <net/bpf.h>
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <net/if_dl.h>
 | 
				
			||||||
 | 
					#include <net/route.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					#include <netinet/icmp6.h>
 | 
				
			||||||
 | 
					#include <netinet/tcp.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum {
 | 
				
			||||||
 | 
						sizeofPtr = sizeof(void*),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					union sockaddr_all {
 | 
				
			||||||
 | 
						struct sockaddr s1;	// this one gets used for fields
 | 
				
			||||||
 | 
						struct sockaddr_in s2;	// these pad it out
 | 
				
			||||||
 | 
						struct sockaddr_in6 s3;
 | 
				
			||||||
 | 
						struct sockaddr_un s4;
 | 
				
			||||||
 | 
						struct sockaddr_dl s5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct sockaddr_any {
 | 
				
			||||||
 | 
						struct sockaddr addr;
 | 
				
			||||||
 | 
						char pad[sizeof(union sockaddr_all) - sizeof(struct sockaddr)];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					import "C"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Machine characteristics; for internal use.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						sizeofPtr      = C.sizeofPtr
 | 
				
			||||||
 | 
						sizeofShort    = C.sizeof_short
 | 
				
			||||||
 | 
						sizeofInt      = C.sizeof_int
 | 
				
			||||||
 | 
						sizeofLong     = C.sizeof_long
 | 
				
			||||||
 | 
						sizeofLongLong = C.sizeof_longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Basic types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type (
 | 
				
			||||||
 | 
						_C_short     C.short
 | 
				
			||||||
 | 
						_C_int       C.int
 | 
				
			||||||
 | 
						_C_long      C.long
 | 
				
			||||||
 | 
						_C_long_long C.longlong
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timespec C.struct_timespec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Timeval C.struct_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Processes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rusage C.struct_rusage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Rlimit C.struct_rlimit
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Gid_t C.gid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Files
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const ( // Directory mode bits
 | 
				
			||||||
 | 
						S_IFMT   = C.S_IFMT
 | 
				
			||||||
 | 
						S_IFIFO  = C.S_IFIFO
 | 
				
			||||||
 | 
						S_IFCHR  = C.S_IFCHR
 | 
				
			||||||
 | 
						S_IFDIR  = C.S_IFDIR
 | 
				
			||||||
 | 
						S_IFBLK  = C.S_IFBLK
 | 
				
			||||||
 | 
						S_IFREG  = C.S_IFREG
 | 
				
			||||||
 | 
						S_IFLNK  = C.S_IFLNK
 | 
				
			||||||
 | 
						S_IFSOCK = C.S_IFSOCK
 | 
				
			||||||
 | 
						S_ISUID  = C.S_ISUID
 | 
				
			||||||
 | 
						S_ISGID  = C.S_ISGID
 | 
				
			||||||
 | 
						S_ISVTX  = C.S_ISVTX
 | 
				
			||||||
 | 
						S_IRUSR  = C.S_IRUSR
 | 
				
			||||||
 | 
						S_IWUSR  = C.S_IWUSR
 | 
				
			||||||
 | 
						S_IXUSR  = C.S_IXUSR
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Stat_t C.struct_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Statfs_t C.struct_statfs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Flock_t C.struct_flock
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Dirent C.struct_dirent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Fsid C.fsid_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sockets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet4 C.struct_sockaddr_in
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrInet6 C.struct_sockaddr_in6
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrUnix C.struct_sockaddr_un
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrDatalink C.struct_sockaddr_dl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddr C.struct_sockaddr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RawSockaddrAny C.struct_sockaddr_any
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type _Socklen C.socklen_t
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Linger C.struct_linger
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Iovec C.struct_iovec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPMreq C.struct_ip_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6Mreq C.struct_ipv6_mreq
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Msghdr C.struct_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Cmsghdr C.struct_cmsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Inet6Pktinfo C.struct_in6_pktinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IPv6MTUInfo C.struct_ip6_mtuinfo
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type ICMPv6Filter C.struct_icmp6_filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofSockaddrInet4    = C.sizeof_struct_sockaddr_in
 | 
				
			||||||
 | 
						SizeofSockaddrInet6    = C.sizeof_struct_sockaddr_in6
 | 
				
			||||||
 | 
						SizeofSockaddrAny      = C.sizeof_struct_sockaddr_any
 | 
				
			||||||
 | 
						SizeofSockaddrUnix     = C.sizeof_struct_sockaddr_un
 | 
				
			||||||
 | 
						SizeofSockaddrDatalink = C.sizeof_struct_sockaddr_dl
 | 
				
			||||||
 | 
						SizeofLinger           = C.sizeof_struct_linger
 | 
				
			||||||
 | 
						SizeofIPMreq           = C.sizeof_struct_ip_mreq
 | 
				
			||||||
 | 
						SizeofIPv6Mreq         = C.sizeof_struct_ipv6_mreq
 | 
				
			||||||
 | 
						SizeofMsghdr           = C.sizeof_struct_msghdr
 | 
				
			||||||
 | 
						SizeofCmsghdr          = C.sizeof_struct_cmsghdr
 | 
				
			||||||
 | 
						SizeofInet6Pktinfo     = C.sizeof_struct_in6_pktinfo
 | 
				
			||||||
 | 
						SizeofIPv6MTUInfo      = C.sizeof_struct_ip6_mtuinfo
 | 
				
			||||||
 | 
						SizeofICMPv6Filter     = C.sizeof_struct_icmp6_filter
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Ptrace requests
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						PTRACE_TRACEME = C.PT_TRACE_ME
 | 
				
			||||||
 | 
						PTRACE_CONT    = C.PT_CONTINUE
 | 
				
			||||||
 | 
						PTRACE_KILL    = C.PT_KILL
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Events (kqueue, kevent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Kevent_t C.struct_kevent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type FdSet C.fd_set
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Routing and interface messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofIfMsghdr         = C.sizeof_struct_if_msghdr
 | 
				
			||||||
 | 
						SizeofIfData           = C.sizeof_struct_if_data
 | 
				
			||||||
 | 
						SizeofIfaMsghdr        = C.sizeof_struct_ifa_msghdr
 | 
				
			||||||
 | 
						SizeofIfAnnounceMsghdr = C.sizeof_struct_if_announcemsghdr
 | 
				
			||||||
 | 
						SizeofRtMsghdr         = C.sizeof_struct_rt_msghdr
 | 
				
			||||||
 | 
						SizeofRtMetrics        = C.sizeof_struct_rt_metrics
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfMsghdr C.struct_if_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfData C.struct_if_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfaMsghdr C.struct_ifa_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type IfAnnounceMsghdr C.struct_if_announcemsghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMsghdr C.struct_rt_msghdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type RtMetrics C.struct_rt_metrics
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Mclpool C.struct_mclpool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Berkeley packet filter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						SizeofBpfVersion = C.sizeof_struct_bpf_version
 | 
				
			||||||
 | 
						SizeofBpfStat    = C.sizeof_struct_bpf_stat
 | 
				
			||||||
 | 
						SizeofBpfProgram = C.sizeof_struct_bpf_program
 | 
				
			||||||
 | 
						SizeofBpfInsn    = C.sizeof_struct_bpf_insn
 | 
				
			||||||
 | 
						SizeofBpfHdr     = C.sizeof_struct_bpf_hdr
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfVersion C.struct_bpf_version
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfStat C.struct_bpf_stat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfProgram C.struct_bpf_program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfInsn C.struct_bpf_insn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfHdr C.struct_bpf_hdr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type BpfTimeval C.struct_bpf_timeval
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Terminal handling
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type Termios C.struct_termios
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue