選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

626 行
15 KiB

  1. // Copyright 2009 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. //go:build darwin || dragonfly || freebsd || netbsd || openbsd
  5. // +build darwin dragonfly freebsd netbsd openbsd
  6. // BSD system call wrappers shared by *BSD based systems
  7. // including OS X (Darwin) and FreeBSD. Like the other
  8. // syscall_*.go files it is compiled as Go code but also
  9. // used as input to mksyscall which parses the //sys
  10. // lines and generates system call stubs.
  11. package unix
  12. import (
  13. "runtime"
  14. "syscall"
  15. "unsafe"
  16. )
  17. const ImplementsGetwd = true
  18. func Getwd() (string, error) {
  19. var buf [PathMax]byte
  20. _, err := Getcwd(buf[0:])
  21. if err != nil {
  22. return "", err
  23. }
  24. n := clen(buf[:])
  25. if n < 1 {
  26. return "", EINVAL
  27. }
  28. return string(buf[:n]), nil
  29. }
  30. /*
  31. * Wrapped
  32. */
  33. //sysnb getgroups(ngid int, gid *_Gid_t) (n int, err error)
  34. //sysnb setgroups(ngid int, gid *_Gid_t) (err error)
  35. func Getgroups() (gids []int, err error) {
  36. n, err := getgroups(0, nil)
  37. if err != nil {
  38. return nil, err
  39. }
  40. if n == 0 {
  41. return nil, nil
  42. }
  43. // Sanity check group count. Max is 16 on BSD.
  44. if n < 0 || n > 1000 {
  45. return nil, EINVAL
  46. }
  47. a := make([]_Gid_t, n)
  48. n, err = getgroups(n, &a[0])
  49. if err != nil {
  50. return nil, err
  51. }
  52. gids = make([]int, n)
  53. for i, v := range a[0:n] {
  54. gids[i] = int(v)
  55. }
  56. return
  57. }
  58. func Setgroups(gids []int) (err error) {
  59. if len(gids) == 0 {
  60. return setgroups(0, nil)
  61. }
  62. a := make([]_Gid_t, len(gids))
  63. for i, v := range gids {
  64. a[i] = _Gid_t(v)
  65. }
  66. return setgroups(len(a), &a[0])
  67. }
  68. // Wait status is 7 bits at bottom, either 0 (exited),
  69. // 0x7F (stopped), or a signal number that caused an exit.
  70. // The 0x80 bit is whether there was a core dump.
  71. // An extra number (exit code, signal causing a stop)
  72. // is in the high bits.
  73. type WaitStatus uint32
  74. const (
  75. mask = 0x7F
  76. core = 0x80
  77. shift = 8
  78. exited = 0
  79. killed = 9
  80. stopped = 0x7F
  81. )
  82. func (w WaitStatus) Exited() bool { return w&mask == exited }
  83. func (w WaitStatus) ExitStatus() int {
  84. if w&mask != exited {
  85. return -1
  86. }
  87. return int(w >> shift)
  88. }
  89. func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != 0 }
  90. func (w WaitStatus) Signal() syscall.Signal {
  91. sig := syscall.Signal(w & mask)
  92. if sig == stopped || sig == 0 {
  93. return -1
  94. }
  95. return sig
  96. }
  97. func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
  98. func (w WaitStatus) Stopped() bool { return w&mask == stopped && syscall.Signal(w>>shift) != SIGSTOP }
  99. func (w WaitStatus) Killed() bool { return w&mask == killed && syscall.Signal(w>>shift) != SIGKILL }
  100. func (w WaitStatus) Continued() bool { return w&mask == stopped && syscall.Signal(w>>shift) == SIGSTOP }
  101. func (w WaitStatus) StopSignal() syscall.Signal {
  102. if !w.Stopped() {
  103. return -1
  104. }
  105. return syscall.Signal(w>>shift) & 0xFF
  106. }
  107. func (w WaitStatus) TrapCause() int { return -1 }
  108. //sys wait4(pid int, wstatus *_C_int, options int, rusage *Rusage) (wpid int, err error)
  109. func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
  110. var status _C_int
  111. wpid, err = wait4(pid, &status, options, rusage)
  112. if wstatus != nil {
  113. *wstatus = WaitStatus(status)
  114. }
  115. return
  116. }
  117. //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error)
  118. //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
  119. //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error)
  120. //sysnb socket(domain int, typ int, proto int) (fd int, err error)
  121. //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
  122. //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
  123. //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
  124. //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error)
  125. //sys Shutdown(s int, how int) (err error)
  126. func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
  127. if sa.Port < 0 || sa.Port > 0xFFFF {
  128. return nil, 0, EINVAL
  129. }
  130. sa.raw.Len = SizeofSockaddrInet4
  131. sa.raw.Family = AF_INET
  132. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  133. p[0] = byte(sa.Port >> 8)
  134. p[1] = byte(sa.Port)
  135. sa.raw.Addr = sa.Addr
  136. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  137. }
  138. func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
  139. if sa.Port < 0 || sa.Port > 0xFFFF {
  140. return nil, 0, EINVAL
  141. }
  142. sa.raw.Len = SizeofSockaddrInet6
  143. sa.raw.Family = AF_INET6
  144. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  145. p[0] = byte(sa.Port >> 8)
  146. p[1] = byte(sa.Port)
  147. sa.raw.Scope_id = sa.ZoneId
  148. sa.raw.Addr = sa.Addr
  149. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  150. }
  151. func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
  152. name := sa.Name
  153. n := len(name)
  154. if n >= len(sa.raw.Path) || n == 0 {
  155. return nil, 0, EINVAL
  156. }
  157. sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
  158. sa.raw.Family = AF_UNIX
  159. for i := 0; i < n; i++ {
  160. sa.raw.Path[i] = int8(name[i])
  161. }
  162. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  163. }
  164. func (sa *SockaddrDatalink) sockaddr() (unsafe.Pointer, _Socklen, error) {
  165. if sa.Index == 0 {
  166. return nil, 0, EINVAL
  167. }
  168. sa.raw.Len = sa.Len
  169. sa.raw.Family = AF_LINK
  170. sa.raw.Index = sa.Index
  171. sa.raw.Type = sa.Type
  172. sa.raw.Nlen = sa.Nlen
  173. sa.raw.Alen = sa.Alen
  174. sa.raw.Slen = sa.Slen
  175. sa.raw.Data = sa.Data
  176. return unsafe.Pointer(&sa.raw), SizeofSockaddrDatalink, nil
  177. }
  178. func anyToSockaddr(fd int, rsa *RawSockaddrAny) (Sockaddr, error) {
  179. switch rsa.Addr.Family {
  180. case AF_LINK:
  181. pp := (*RawSockaddrDatalink)(unsafe.Pointer(rsa))
  182. sa := new(SockaddrDatalink)
  183. sa.Len = pp.Len
  184. sa.Family = pp.Family
  185. sa.Index = pp.Index
  186. sa.Type = pp.Type
  187. sa.Nlen = pp.Nlen
  188. sa.Alen = pp.Alen
  189. sa.Slen = pp.Slen
  190. sa.Data = pp.Data
  191. return sa, nil
  192. case AF_UNIX:
  193. pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
  194. if pp.Len < 2 || pp.Len > SizeofSockaddrUnix {
  195. return nil, EINVAL
  196. }
  197. sa := new(SockaddrUnix)
  198. // Some BSDs include the trailing NUL in the length, whereas
  199. // others do not. Work around this by subtracting the leading
  200. // family and len. The path is then scanned to see if a NUL
  201. // terminator still exists within the length.
  202. n := int(pp.Len) - 2 // subtract leading Family, Len
  203. for i := 0; i < n; i++ {
  204. if pp.Path[i] == 0 {
  205. // found early NUL; assume Len included the NUL
  206. // or was overestimating.
  207. n = i
  208. break
  209. }
  210. }
  211. bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
  212. sa.Name = string(bytes)
  213. return sa, nil
  214. case AF_INET:
  215. pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
  216. sa := new(SockaddrInet4)
  217. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  218. sa.Port = int(p[0])<<8 + int(p[1])
  219. sa.Addr = pp.Addr
  220. return sa, nil
  221. case AF_INET6:
  222. pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
  223. sa := new(SockaddrInet6)
  224. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  225. sa.Port = int(p[0])<<8 + int(p[1])
  226. sa.ZoneId = pp.Scope_id
  227. sa.Addr = pp.Addr
  228. return sa, nil
  229. }
  230. return anyToSockaddrGOOS(fd, rsa)
  231. }
  232. func Accept(fd int) (nfd int, sa Sockaddr, err error) {
  233. var rsa RawSockaddrAny
  234. var len _Socklen = SizeofSockaddrAny
  235. nfd, err = accept(fd, &rsa, &len)
  236. if err != nil {
  237. return
  238. }
  239. if (runtime.GOOS == "darwin" || runtime.GOOS == "ios") && len == 0 {
  240. // Accepted socket has no address.
  241. // This is likely due to a bug in xnu kernels,
  242. // where instead of ECONNABORTED error socket
  243. // is accepted, but has no address.
  244. Close(nfd)
  245. return 0, nil, ECONNABORTED
  246. }
  247. sa, err = anyToSockaddr(fd, &rsa)
  248. if err != nil {
  249. Close(nfd)
  250. nfd = 0
  251. }
  252. return
  253. }
  254. func Getsockname(fd int) (sa Sockaddr, err error) {
  255. var rsa RawSockaddrAny
  256. var len _Socklen = SizeofSockaddrAny
  257. if err = getsockname(fd, &rsa, &len); err != nil {
  258. return
  259. }
  260. // TODO(jsing): DragonFly has a "bug" (see issue 3349), which should be
  261. // reported upstream.
  262. if runtime.GOOS == "dragonfly" && rsa.Addr.Family == AF_UNSPEC && rsa.Addr.Len == 0 {
  263. rsa.Addr.Family = AF_UNIX
  264. rsa.Addr.Len = SizeofSockaddrUnix
  265. }
  266. return anyToSockaddr(fd, &rsa)
  267. }
  268. //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
  269. // GetsockoptString returns the string value of the socket option opt for the
  270. // socket associated with fd at the given socket level.
  271. func GetsockoptString(fd, level, opt int) (string, error) {
  272. buf := make([]byte, 256)
  273. vallen := _Socklen(len(buf))
  274. err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
  275. if err != nil {
  276. return "", err
  277. }
  278. return string(buf[:vallen-1]), nil
  279. }
  280. //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error)
  281. //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error)
  282. //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error)
  283. func recvmsgRaw(fd int, iov []Iovec, oob []byte, flags int, rsa *RawSockaddrAny) (n, oobn int, recvflags int, err error) {
  284. var msg Msghdr
  285. msg.Name = (*byte)(unsafe.Pointer(rsa))
  286. msg.Namelen = uint32(SizeofSockaddrAny)
  287. var dummy byte
  288. if len(oob) > 0 {
  289. // receive at least one normal byte
  290. if emptyIovecs(iov) {
  291. var iova [1]Iovec
  292. iova[0].Base = &dummy
  293. iova[0].SetLen(1)
  294. iov = iova[:]
  295. }
  296. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  297. msg.SetControllen(len(oob))
  298. }
  299. if len(iov) > 0 {
  300. msg.Iov = &iov[0]
  301. msg.SetIovlen(len(iov))
  302. }
  303. if n, err = recvmsg(fd, &msg, flags); err != nil {
  304. return
  305. }
  306. oobn = int(msg.Controllen)
  307. recvflags = int(msg.Flags)
  308. return
  309. }
  310. //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error)
  311. func sendmsgN(fd int, iov []Iovec, oob []byte, ptr unsafe.Pointer, salen _Socklen, flags int) (n int, err error) {
  312. var msg Msghdr
  313. msg.Name = (*byte)(unsafe.Pointer(ptr))
  314. msg.Namelen = uint32(salen)
  315. var dummy byte
  316. var empty bool
  317. if len(oob) > 0 {
  318. // send at least one normal byte
  319. empty = emptyIovecs(iov)
  320. if empty {
  321. var iova [1]Iovec
  322. iova[0].Base = &dummy
  323. iova[0].SetLen(1)
  324. iov = iova[:]
  325. }
  326. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  327. msg.SetControllen(len(oob))
  328. }
  329. if len(iov) > 0 {
  330. msg.Iov = &iov[0]
  331. msg.SetIovlen(len(iov))
  332. }
  333. if n, err = sendmsg(fd, &msg, flags); err != nil {
  334. return 0, err
  335. }
  336. if len(oob) > 0 && empty {
  337. n = 0
  338. }
  339. return n, nil
  340. }
  341. //sys kevent(kq int, change unsafe.Pointer, nchange int, event unsafe.Pointer, nevent int, timeout *Timespec) (n int, err error)
  342. func Kevent(kq int, changes, events []Kevent_t, timeout *Timespec) (n int, err error) {
  343. var change, event unsafe.Pointer
  344. if len(changes) > 0 {
  345. change = unsafe.Pointer(&changes[0])
  346. }
  347. if len(events) > 0 {
  348. event = unsafe.Pointer(&events[0])
  349. }
  350. return kevent(kq, change, len(changes), event, len(events), timeout)
  351. }
  352. // sysctlmib translates name to mib number and appends any additional args.
  353. func sysctlmib(name string, args ...int) ([]_C_int, error) {
  354. // Translate name to mib number.
  355. mib, err := nametomib(name)
  356. if err != nil {
  357. return nil, err
  358. }
  359. for _, a := range args {
  360. mib = append(mib, _C_int(a))
  361. }
  362. return mib, nil
  363. }
  364. func Sysctl(name string) (string, error) {
  365. return SysctlArgs(name)
  366. }
  367. func SysctlArgs(name string, args ...int) (string, error) {
  368. buf, err := SysctlRaw(name, args...)
  369. if err != nil {
  370. return "", err
  371. }
  372. n := len(buf)
  373. // Throw away terminating NUL.
  374. if n > 0 && buf[n-1] == '\x00' {
  375. n--
  376. }
  377. return string(buf[0:n]), nil
  378. }
  379. func SysctlUint32(name string) (uint32, error) {
  380. return SysctlUint32Args(name)
  381. }
  382. func SysctlUint32Args(name string, args ...int) (uint32, error) {
  383. mib, err := sysctlmib(name, args...)
  384. if err != nil {
  385. return 0, err
  386. }
  387. n := uintptr(4)
  388. buf := make([]byte, 4)
  389. if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
  390. return 0, err
  391. }
  392. if n != 4 {
  393. return 0, EIO
  394. }
  395. return *(*uint32)(unsafe.Pointer(&buf[0])), nil
  396. }
  397. func SysctlUint64(name string, args ...int) (uint64, error) {
  398. mib, err := sysctlmib(name, args...)
  399. if err != nil {
  400. return 0, err
  401. }
  402. n := uintptr(8)
  403. buf := make([]byte, 8)
  404. if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
  405. return 0, err
  406. }
  407. if n != 8 {
  408. return 0, EIO
  409. }
  410. return *(*uint64)(unsafe.Pointer(&buf[0])), nil
  411. }
  412. func SysctlRaw(name string, args ...int) ([]byte, error) {
  413. mib, err := sysctlmib(name, args...)
  414. if err != nil {
  415. return nil, err
  416. }
  417. // Find size.
  418. n := uintptr(0)
  419. if err := sysctl(mib, nil, &n, nil, 0); err != nil {
  420. return nil, err
  421. }
  422. if n == 0 {
  423. return nil, nil
  424. }
  425. // Read into buffer of that size.
  426. buf := make([]byte, n)
  427. if err := sysctl(mib, &buf[0], &n, nil, 0); err != nil {
  428. return nil, err
  429. }
  430. // The actual call may return less than the original reported required
  431. // size so ensure we deal with that.
  432. return buf[:n], nil
  433. }
  434. func SysctlClockinfo(name string) (*Clockinfo, error) {
  435. mib, err := sysctlmib(name)
  436. if err != nil {
  437. return nil, err
  438. }
  439. n := uintptr(SizeofClockinfo)
  440. var ci Clockinfo
  441. if err := sysctl(mib, (*byte)(unsafe.Pointer(&ci)), &n, nil, 0); err != nil {
  442. return nil, err
  443. }
  444. if n != SizeofClockinfo {
  445. return nil, EIO
  446. }
  447. return &ci, nil
  448. }
  449. func SysctlTimeval(name string) (*Timeval, error) {
  450. mib, err := sysctlmib(name)
  451. if err != nil {
  452. return nil, err
  453. }
  454. var tv Timeval
  455. n := uintptr(unsafe.Sizeof(tv))
  456. if err := sysctl(mib, (*byte)(unsafe.Pointer(&tv)), &n, nil, 0); err != nil {
  457. return nil, err
  458. }
  459. if n != unsafe.Sizeof(tv) {
  460. return nil, EIO
  461. }
  462. return &tv, nil
  463. }
  464. //sys utimes(path string, timeval *[2]Timeval) (err error)
  465. func Utimes(path string, tv []Timeval) error {
  466. if tv == nil {
  467. return utimes(path, nil)
  468. }
  469. if len(tv) != 2 {
  470. return EINVAL
  471. }
  472. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  473. }
  474. func UtimesNano(path string, ts []Timespec) error {
  475. if ts == nil {
  476. err := utimensat(AT_FDCWD, path, nil, 0)
  477. if err != ENOSYS {
  478. return err
  479. }
  480. return utimes(path, nil)
  481. }
  482. if len(ts) != 2 {
  483. return EINVAL
  484. }
  485. err := utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
  486. if err != ENOSYS {
  487. return err
  488. }
  489. // Not as efficient as it could be because Timespec and
  490. // Timeval have different types in the different OSes
  491. tv := [2]Timeval{
  492. NsecToTimeval(TimespecToNsec(ts[0])),
  493. NsecToTimeval(TimespecToNsec(ts[1])),
  494. }
  495. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  496. }
  497. func UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) error {
  498. if ts == nil {
  499. return utimensat(dirfd, path, nil, flags)
  500. }
  501. if len(ts) != 2 {
  502. return EINVAL
  503. }
  504. return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
  505. }
  506. //sys futimes(fd int, timeval *[2]Timeval) (err error)
  507. func Futimes(fd int, tv []Timeval) error {
  508. if tv == nil {
  509. return futimes(fd, nil)
  510. }
  511. if len(tv) != 2 {
  512. return EINVAL
  513. }
  514. return futimes(fd, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  515. }
  516. //sys poll(fds *PollFd, nfds int, timeout int) (n int, err error)
  517. func Poll(fds []PollFd, timeout int) (n int, err error) {
  518. if len(fds) == 0 {
  519. return poll(nil, 0, timeout)
  520. }
  521. return poll(&fds[0], len(fds), timeout)
  522. }
  523. // TODO: wrap
  524. // Acct(name nil-string) (err error)
  525. // Gethostuuid(uuid *byte, timeout *Timespec) (err error)
  526. // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error)
  527. var mapper = &mmapper{
  528. active: make(map[*byte][]byte),
  529. mmap: mmap,
  530. munmap: munmap,
  531. }
  532. func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  533. return mapper.Mmap(fd, offset, length, prot, flags)
  534. }
  535. func Munmap(b []byte) (err error) {
  536. return mapper.Munmap(b)
  537. }
  538. //sys Madvise(b []byte, behav int) (err error)
  539. //sys Mlock(b []byte) (err error)
  540. //sys Mlockall(flags int) (err error)
  541. //sys Mprotect(b []byte, prot int) (err error)
  542. //sys Msync(b []byte, flags int) (err error)
  543. //sys Munlock(b []byte) (err error)
  544. //sys Munlockall() (err error)