libcall_glibc.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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 hurd || linux
  5. // +build hurd linux
  6. // glibc library calls.
  7. package syscall
  8. import (
  9. "internal/itoa"
  10. "internal/race"
  11. "unsafe"
  12. )
  13. //sys Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error)
  14. //__go_openat(dirfd _C_int, path *byte, flags _C_int, mode Mode_t) _C_int
  15. //sys futimesat(dirfd int, path *byte, times *[2]Timeval) (err error)
  16. //futimesat(dirfd _C_int, path *byte, times *[2]Timeval) _C_int
  17. func Futimesat(dirfd int, path string, tv []Timeval) (err error) {
  18. if len(tv) != 2 {
  19. return EINVAL
  20. }
  21. return futimesat(dirfd, StringBytePtr(path), (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  22. }
  23. func Futimes(fd int, tv []Timeval) (err error) {
  24. // Believe it or not, this is the best we can do on GNU/Linux
  25. // (and is what glibc does).
  26. return Utimes("/proc/self/fd/"+itoa.Itoa(fd), tv)
  27. }
  28. //sys accept4(fd int, sa *RawSockaddrAny, len *Socklen_t, flags int) (nfd int, err error)
  29. //accept4(fd _C_int, sa *RawSockaddrAny, len *Socklen_t, flags _C_int) _C_int
  30. func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
  31. var rsa RawSockaddrAny
  32. var len Socklen_t = SizeofSockaddrAny
  33. nfd, err = accept4(fd, &rsa, &len, flags)
  34. if err != nil {
  35. return -1, nil, err
  36. }
  37. sa, err = anyToSockaddr(&rsa)
  38. if err != nil {
  39. Close(nfd)
  40. return -1, nil, err
  41. }
  42. return nfd, sa, nil
  43. }
  44. //sysnb Dup3(oldfd int, newfd int, flags int) (err error)
  45. //dup3(oldfd _C_int, newfd _C_int, flags _C_int) _C_int
  46. //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error)
  47. //faccessat(dirfd _C_int, pathname *byte, mode _C_int, flags _C_int) _C_int
  48. //sys Fallocate(fd int, mode uint32, off int64, len int64) (err error)
  49. //fallocate(fd _C_int, mode _C_int, offset Offset_t, len Offset_t) _C_int
  50. //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error)
  51. //fchmodat(dirfd _C_int, pathname *byte, mode Mode_t, flags _C_int) _C_int
  52. //sys Fchownat(dirfd int, path string, uid int, gid int, flags int) (err error)
  53. //fchownat(dirfd _C_int, path *byte, owner Uid_t, group Gid_t, flags _C_int) _C_int
  54. //sys Flock(fd int, how int) (err error)
  55. //flock(fd _C_int, how _C_int) _C_int
  56. func Getdents(fd int, buf []byte) (n int, err error) {
  57. var p *byte
  58. if len(buf) > 0 {
  59. p = &buf[0]
  60. } else {
  61. p = (*byte)(unsafe.Pointer(&_zero))
  62. }
  63. s := SYS_GETDENTS64
  64. if s == 0 {
  65. s = SYS_GETDENTS
  66. }
  67. r1, _, errno := Syscall(uintptr(s), uintptr(fd), uintptr(unsafe.Pointer(p)), uintptr(len(buf)))
  68. n = int(r1)
  69. if n < 0 {
  70. err = errno
  71. }
  72. return
  73. }
  74. func ReadDirent(fd int, buf []byte) (n int, err error) {
  75. return Getdents(fd, buf)
  76. }
  77. //sys Mkdirat(dirfd int, path string, mode uint32) (err error)
  78. //mkdirat(dirfd _C_int, path *byte, mode Mode_t) _C_int
  79. //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error)
  80. //mknodat(dirfd _C_int, path *byte, mode Mode_t, dev _dev_t) _C_int
  81. //sysnb pipe2(p *[2]_C_int, flags int) (err error)
  82. //pipe2(p *[2]_C_int, flags _C_int) _C_int
  83. func Pipe2(p []int, flags int) (err error) {
  84. if len(p) != 2 {
  85. return EINVAL
  86. }
  87. var pp [2]_C_int
  88. err = pipe2(&pp, flags)
  89. p[0] = int(pp[0])
  90. p[1] = int(pp[1])
  91. return
  92. }
  93. //sys sendfile(outfd int, infd int, offset *Offset_t, count int) (written int, err error)
  94. //sendfile64(outfd _C_int, infd _C_int, offset *Offset_t, count Size_t) Ssize_t
  95. func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) {
  96. if race.Enabled {
  97. race.ReleaseMerge(unsafe.Pointer(&ioSync))
  98. }
  99. var soff Offset_t
  100. var psoff *Offset_t
  101. if offset != nil {
  102. soff = Offset_t(*offset)
  103. psoff = &soff
  104. }
  105. written, err = sendfile(outfd, infd, psoff, count)
  106. if offset != nil {
  107. *offset = int64(soff)
  108. }
  109. return
  110. }
  111. //sys SyncFileRange(fd int, off int64, n int64, flags int) (err error)
  112. //sync_file_range(fd _C_int, off Offset_t, n Offset_t, flags _C_uint) _C_int