vendor/golang.org/x/sys/unix/syscall_darwin.go
changeset 260 445e01aede7e
parent 256 6d9efbef00a9
child 262 8d3354485fc3
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
    46 	sa.raw.Sc_id = sa.ID
    46 	sa.raw.Sc_id = sa.ID
    47 	sa.raw.Sc_unit = sa.Unit
    47 	sa.raw.Sc_unit = sa.Unit
    48 	return unsafe.Pointer(&sa.raw), SizeofSockaddrCtl, nil
    48 	return unsafe.Pointer(&sa.raw), SizeofSockaddrCtl, nil
    49 }
    49 }
    50 
    50 
       
    51 // SockaddrVM implements the Sockaddr interface for AF_VSOCK type sockets.
       
    52 // SockaddrVM provides access to Darwin VM sockets: a mechanism that enables
       
    53 // bidirectional communication between a hypervisor and its guest virtual
       
    54 // machines.
       
    55 type SockaddrVM struct {
       
    56 	// CID and Port specify a context ID and port address for a VM socket.
       
    57 	// Guests have a unique CID, and hosts may have a well-known CID of:
       
    58 	//  - VMADDR_CID_HYPERVISOR: refers to the hypervisor process.
       
    59 	//  - VMADDR_CID_LOCAL: refers to local communication (loopback).
       
    60 	//  - VMADDR_CID_HOST: refers to other processes on the host.
       
    61 	CID  uint32
       
    62 	Port uint32
       
    63 	raw  RawSockaddrVM
       
    64 }
       
    65 
       
    66 func (sa *SockaddrVM) sockaddr() (unsafe.Pointer, _Socklen, error) {
       
    67 	sa.raw.Len = SizeofSockaddrVM
       
    68 	sa.raw.Family = AF_VSOCK
       
    69 	sa.raw.Port = sa.Port
       
    70 	sa.raw.Cid = sa.CID
       
    71 
       
    72 	return unsafe.Pointer(&sa.raw), SizeofSockaddrVM, nil
       
    73 }
       
    74 
    51 func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
    75 func anyToSockaddrGOOS(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
    52 	switch rsa.Addr.Family {
    76 	switch rsa.Addr.Family {
    53 	case AF_SYSTEM:
    77 	case AF_SYSTEM:
    54 		pp := (*RawSockaddrCtl)(unsafe.Pointer(rsa))
    78 		pp := (*RawSockaddrCtl)(unsafe.Pointer(rsa))
    55 		if pp.Ss_sysaddr == AF_SYS_CONTROL {
    79 		if pp.Ss_sysaddr == AF_SYS_CONTROL {
    56 			sa := new(SockaddrCtl)
    80 			sa := new(SockaddrCtl)
    57 			sa.ID = pp.Sc_id
    81 			sa.ID = pp.Sc_id
    58 			sa.Unit = pp.Sc_unit
    82 			sa.Unit = pp.Sc_unit
    59 			return sa, nil
    83 			return sa, nil
    60 		}
    84 		}
       
    85 	case AF_VSOCK:
       
    86 		pp := (*RawSockaddrVM)(unsafe.Pointer(rsa))
       
    87 		sa := &SockaddrVM{
       
    88 			CID:  pp.Cid,
       
    89 			Port: pp.Port,
       
    90 		}
       
    91 		return sa, nil
    61 	}
    92 	}
    62 	return nil, EAFNOSUPPORT
    93 	return nil, EAFNOSUPPORT
    63 }
    94 }
    64 
    95 
    65 // Some external packages rely on SYS___SYSCTL being defined to implement their
    96 // Some external packages rely on SYS___SYSCTL being defined to implement their
   108 }
   139 }
   109 
   140 
   110 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
   141 func PtraceAttach(pid int) (err error) { return ptrace(PT_ATTACH, pid, 0, 0) }
   111 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
   142 func PtraceDetach(pid int) (err error) { return ptrace(PT_DETACH, pid, 0, 0) }
   112 
   143 
   113 type attrList struct {
       
   114 	bitmapCount uint16
       
   115 	_           uint16
       
   116 	CommonAttr  uint32
       
   117 	VolAttr     uint32
       
   118 	DirAttr     uint32
       
   119 	FileAttr    uint32
       
   120 	Forkattr    uint32
       
   121 }
       
   122 
       
   123 //sysnb	pipe(p *[2]int32) (err error)
   144 //sysnb	pipe(p *[2]int32) (err error)
   124 
   145 
   125 func Pipe(p []int) (err error) {
   146 func Pipe(p []int) (err error) {
   126 	if len(p) != 2 {
   147 	if len(p) != 2 {
   127 		return EINVAL
   148 		return EINVAL
   128 	}
   149 	}
   129 	var x [2]int32
   150 	var x [2]int32
   130 	err = pipe(&x)
   151 	err = pipe(&x)
   131 	p[0] = int(x[0])
   152 	if err == nil {
   132 	p[1] = int(x[1])
   153 		p[0] = int(x[0])
       
   154 		p[1] = int(x[1])
       
   155 	}
   133 	return
   156 	return
   134 }
   157 }
   135 
   158 
   136 func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
   159 func Getfsstat(buf []Statfs_t, flags int) (n int, err error) {
   137 	var _p0 unsafe.Pointer
   160 	var _p0 unsafe.Pointer
   247 
   270 
   248 func Flistxattr(fd int, dest []byte) (sz int, err error) {
   271 func Flistxattr(fd int, dest []byte) (sz int, err error) {
   249 	return flistxattr(fd, xattrPointer(dest), len(dest), 0)
   272 	return flistxattr(fd, xattrPointer(dest), len(dest), 0)
   250 }
   273 }
   251 
   274 
   252 func setattrlistTimes(path string, times []Timespec, flags int) error {
   275 //sys	utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error)
   253 	_p0, err := BytePtrFromString(path)
       
   254 	if err != nil {
       
   255 		return err
       
   256 	}
       
   257 
       
   258 	var attrList attrList
       
   259 	attrList.bitmapCount = ATTR_BIT_MAP_COUNT
       
   260 	attrList.CommonAttr = ATTR_CMN_MODTIME | ATTR_CMN_ACCTIME
       
   261 
       
   262 	// order is mtime, atime: the opposite of Chtimes
       
   263 	attributes := [2]Timespec{times[1], times[0]}
       
   264 	options := 0
       
   265 	if flags&AT_SYMLINK_NOFOLLOW != 0 {
       
   266 		options |= FSOPT_NOFOLLOW
       
   267 	}
       
   268 	return setattrlist(
       
   269 		_p0,
       
   270 		unsafe.Pointer(&attrList),
       
   271 		unsafe.Pointer(&attributes),
       
   272 		unsafe.Sizeof(attributes),
       
   273 		options)
       
   274 }
       
   275 
       
   276 //sys	setattrlist(path *byte, list unsafe.Pointer, buf unsafe.Pointer, size uintptr, options int) (err error)
       
   277 
       
   278 func utimensat(dirfd int, path string, times *[2]Timespec, flags int) error {
       
   279 	// Darwin doesn't support SYS_UTIMENSAT
       
   280 	return ENOSYS
       
   281 }
       
   282 
   276 
   283 /*
   277 /*
   284  * Wrapped
   278  * Wrapped
   285  */
   279  */
   286 
   280 
   397 	vallen := _Socklen(SizeofXucred)
   391 	vallen := _Socklen(SizeofXucred)
   398 	err := getsockopt(fd, level, opt, unsafe.Pointer(x), &vallen)
   392 	err := getsockopt(fd, level, opt, unsafe.Pointer(x), &vallen)
   399 	return x, err
   393 	return x, err
   400 }
   394 }
   401 
   395 
   402 func SysctlKinfoProcSlice(name string) ([]KinfoProc, error) {
   396 func GetsockoptTCPConnectionInfo(fd, level, opt int) (*TCPConnectionInfo, error) {
   403 	mib, err := sysctlmib(name)
   397 	var value TCPConnectionInfo
       
   398 	vallen := _Socklen(SizeofTCPConnectionInfo)
       
   399 	err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
       
   400 	return &value, err
       
   401 }
       
   402 
       
   403 func SysctlKinfoProc(name string, args ...int) (*KinfoProc, error) {
       
   404 	mib, err := sysctlmib(name, args...)
       
   405 	if err != nil {
       
   406 		return nil, err
       
   407 	}
       
   408 
       
   409 	var kinfo KinfoProc
       
   410 	n := uintptr(SizeofKinfoProc)
       
   411 	if err := sysctl(mib, (*byte)(unsafe.Pointer(&kinfo)), &n, nil, 0); err != nil {
       
   412 		return nil, err
       
   413 	}
       
   414 	if n != SizeofKinfoProc {
       
   415 		return nil, EIO
       
   416 	}
       
   417 	return &kinfo, nil
       
   418 }
       
   419 
       
   420 func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) {
       
   421 	mib, err := sysctlmib(name, args...)
   404 	if err != nil {
   422 	if err != nil {
   405 		return nil, err
   423 		return nil, err
   406 	}
   424 	}
   407 
   425 
   408 	// Find size.
   426 	// Find size.
   430 	// size so ensure we deal with that.
   448 	// size so ensure we deal with that.
   431 	return buf[:n/SizeofKinfoProc], nil
   449 	return buf[:n/SizeofKinfoProc], nil
   432 }
   450 }
   433 
   451 
   434 //sys	sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
   452 //sys	sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error)
       
   453 
       
   454 //sys	shmat(id int, addr uintptr, flag int) (ret uintptr, err error)
       
   455 //sys	shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error)
       
   456 //sys	shmdt(addr uintptr) (err error)
       
   457 //sys	shmget(key int, size int, flag int) (id int, err error)
   435 
   458 
   436 /*
   459 /*
   437  * Exposed directly
   460  * Exposed directly
   438  */
   461  */
   439 //sys	Access(path string, mode uint32) (err error)
   462 //sys	Access(path string, mode uint32) (err error)
   486 //sys	Listen(s int, backlog int) (err error)
   509 //sys	Listen(s int, backlog int) (err error)
   487 //sys	Mkdir(path string, mode uint32) (err error)
   510 //sys	Mkdir(path string, mode uint32) (err error)
   488 //sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
   511 //sys	Mkdirat(dirfd int, path string, mode uint32) (err error)
   489 //sys	Mkfifo(path string, mode uint32) (err error)
   512 //sys	Mkfifo(path string, mode uint32) (err error)
   490 //sys	Mknod(path string, mode uint32, dev int) (err error)
   513 //sys	Mknod(path string, mode uint32, dev int) (err error)
       
   514 //sys	Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error)
   491 //sys	Open(path string, mode int, perm uint32) (fd int, err error)
   515 //sys	Open(path string, mode int, perm uint32) (fd int, err error)
   492 //sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
   516 //sys	Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error)
   493 //sys	Pathconf(path string, name int) (val int, err error)
   517 //sys	Pathconf(path string, name int) (val int, err error)
   494 //sys	Pread(fd int, p []byte, offset int64) (n int, err error)
   518 //sys	pread(fd int, p []byte, offset int64) (n int, err error)
   495 //sys	Pwrite(fd int, p []byte, offset int64) (n int, err error)
   519 //sys	pwrite(fd int, p []byte, offset int64) (n int, err error)
   496 //sys	read(fd int, p []byte) (n int, err error)
   520 //sys	read(fd int, p []byte) (n int, err error)
   497 //sys	Readlink(path string, buf []byte) (n int, err error)
   521 //sys	Readlink(path string, buf []byte) (n int, err error)
   498 //sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
   522 //sys	Readlinkat(dirfd int, path string, buf []byte) (n int, err error)
   499 //sys	Rename(from string, to string) (err error)
   523 //sys	Rename(from string, to string) (err error)
   500 //sys	Renameat(fromfd int, from string, tofd int, to string) (err error)
   524 //sys	Renameat(fromfd int, from string, tofd int, to string) (err error)
   554 // Readv
   578 // Readv
   555 // Writev
   579 // Writev
   556 // Nfssvc
   580 // Nfssvc
   557 // Getfh
   581 // Getfh
   558 // Quotactl
   582 // Quotactl
   559 // Mount
       
   560 // Csops
   583 // Csops
   561 // Waitid
   584 // Waitid
   562 // Add_profil
   585 // Add_profil
   563 // Kdebug_trace
   586 // Kdebug_trace
   564 // Sigreturn
   587 // Sigreturn
   588 // Semop
   611 // Semop
   589 // Msgctl
   612 // Msgctl
   590 // Msgget
   613 // Msgget
   591 // Msgsnd
   614 // Msgsnd
   592 // Msgrcv
   615 // Msgrcv
   593 // Shmat
       
   594 // Shmctl
       
   595 // Shmdt
       
   596 // Shmget
       
   597 // Shm_open
   616 // Shm_open
   598 // Shm_unlink
   617 // Shm_unlink
   599 // Sem_open
   618 // Sem_open
   600 // Sem_close
   619 // Sem_close
   601 // Sem_unlink
   620 // Sem_unlink