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) |