Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

syscall_zos_s390x.go 49KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823
  1. // Copyright 2020 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 zos && s390x
  5. // +build zos,s390x
  6. package unix
  7. import (
  8. "bytes"
  9. "runtime"
  10. "sort"
  11. "sync"
  12. "syscall"
  13. "unsafe"
  14. )
  15. const (
  16. O_CLOEXEC = 0 // Dummy value (not supported).
  17. AF_LOCAL = AF_UNIX // AF_LOCAL is an alias for AF_UNIX
  18. )
  19. func syscall_syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
  20. func syscall_rawsyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
  21. func syscall_syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
  22. func syscall_rawsyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
  23. func syscall_syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
  24. func syscall_rawsyscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
  25. func copyStat(stat *Stat_t, statLE *Stat_LE_t) {
  26. stat.Dev = uint64(statLE.Dev)
  27. stat.Ino = uint64(statLE.Ino)
  28. stat.Nlink = uint64(statLE.Nlink)
  29. stat.Mode = uint32(statLE.Mode)
  30. stat.Uid = uint32(statLE.Uid)
  31. stat.Gid = uint32(statLE.Gid)
  32. stat.Rdev = uint64(statLE.Rdev)
  33. stat.Size = statLE.Size
  34. stat.Atim.Sec = int64(statLE.Atim)
  35. stat.Atim.Nsec = 0 //zos doesn't return nanoseconds
  36. stat.Mtim.Sec = int64(statLE.Mtim)
  37. stat.Mtim.Nsec = 0 //zos doesn't return nanoseconds
  38. stat.Ctim.Sec = int64(statLE.Ctim)
  39. stat.Ctim.Nsec = 0 //zos doesn't return nanoseconds
  40. stat.Blksize = int64(statLE.Blksize)
  41. stat.Blocks = statLE.Blocks
  42. }
  43. func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
  44. func svcLoad(name *byte) unsafe.Pointer
  45. func svcUnload(name *byte, fnptr unsafe.Pointer) int64
  46. func (d *Dirent) NameString() string {
  47. if d == nil {
  48. return ""
  49. }
  50. return string(d.Name[:d.Namlen])
  51. }
  52. func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
  53. if sa.Port < 0 || sa.Port > 0xFFFF {
  54. return nil, 0, EINVAL
  55. }
  56. sa.raw.Len = SizeofSockaddrInet4
  57. sa.raw.Family = AF_INET
  58. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  59. p[0] = byte(sa.Port >> 8)
  60. p[1] = byte(sa.Port)
  61. sa.raw.Addr = sa.Addr
  62. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  63. }
  64. func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
  65. if sa.Port < 0 || sa.Port > 0xFFFF {
  66. return nil, 0, EINVAL
  67. }
  68. sa.raw.Len = SizeofSockaddrInet6
  69. sa.raw.Family = AF_INET6
  70. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  71. p[0] = byte(sa.Port >> 8)
  72. p[1] = byte(sa.Port)
  73. sa.raw.Scope_id = sa.ZoneId
  74. sa.raw.Addr = sa.Addr
  75. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  76. }
  77. func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
  78. name := sa.Name
  79. n := len(name)
  80. if n >= len(sa.raw.Path) || n == 0 {
  81. return nil, 0, EINVAL
  82. }
  83. sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
  84. sa.raw.Family = AF_UNIX
  85. for i := 0; i < n; i++ {
  86. sa.raw.Path[i] = int8(name[i])
  87. }
  88. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  89. }
  90. func anyToSockaddr(_ int, rsa *RawSockaddrAny) (Sockaddr, error) {
  91. // TODO(neeilan): Implement use of first param (fd)
  92. switch rsa.Addr.Family {
  93. case AF_UNIX:
  94. pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
  95. sa := new(SockaddrUnix)
  96. // For z/OS, only replace NUL with @ when the
  97. // length is not zero.
  98. if pp.Len != 0 && pp.Path[0] == 0 {
  99. // "Abstract" Unix domain socket.
  100. // Rewrite leading NUL as @ for textual display.
  101. // (This is the standard convention.)
  102. // Not friendly to overwrite in place,
  103. // but the callers below don't care.
  104. pp.Path[0] = '@'
  105. }
  106. // Assume path ends at NUL.
  107. //
  108. // For z/OS, the length of the name is a field
  109. // in the structure. To be on the safe side, we
  110. // will still scan the name for a NUL but only
  111. // to the length provided in the structure.
  112. //
  113. // This is not technically the Linux semantics for
  114. // abstract Unix domain sockets--they are supposed
  115. // to be uninterpreted fixed-size binary blobs--but
  116. // everyone uses this convention.
  117. n := 0
  118. for n < int(pp.Len) && pp.Path[n] != 0 {
  119. n++
  120. }
  121. bytes := (*[len(pp.Path)]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
  122. sa.Name = string(bytes)
  123. return sa, nil
  124. case AF_INET:
  125. pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
  126. sa := new(SockaddrInet4)
  127. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  128. sa.Port = int(p[0])<<8 + int(p[1])
  129. sa.Addr = pp.Addr
  130. return sa, nil
  131. case AF_INET6:
  132. pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
  133. sa := new(SockaddrInet6)
  134. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  135. sa.Port = int(p[0])<<8 + int(p[1])
  136. sa.ZoneId = pp.Scope_id
  137. sa.Addr = pp.Addr
  138. return sa, nil
  139. }
  140. return nil, EAFNOSUPPORT
  141. }
  142. func Accept(fd int) (nfd int, sa Sockaddr, err error) {
  143. var rsa RawSockaddrAny
  144. var len _Socklen = SizeofSockaddrAny
  145. nfd, err = accept(fd, &rsa, &len)
  146. if err != nil {
  147. return
  148. }
  149. // TODO(neeilan): Remove 0 in call
  150. sa, err = anyToSockaddr(0, &rsa)
  151. if err != nil {
  152. Close(nfd)
  153. nfd = 0
  154. }
  155. return
  156. }
  157. func (iov *Iovec) SetLen(length int) {
  158. iov.Len = uint64(length)
  159. }
  160. func (msghdr *Msghdr) SetControllen(length int) {
  161. msghdr.Controllen = int32(length)
  162. }
  163. func (cmsg *Cmsghdr) SetLen(length int) {
  164. cmsg.Len = int32(length)
  165. }
  166. //sys fcntl(fd int, cmd int, arg int) (val int, err error)
  167. //sys read(fd int, p []byte) (n int, err error)
  168. //sys readlen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_READ
  169. //sys write(fd int, p []byte) (n int, err error)
  170. //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = SYS___ACCEPT_A
  171. //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___BIND_A
  172. //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___CONNECT_A
  173. //sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
  174. //sysnb setgroups(n int, list *_Gid_t) (err error)
  175. //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
  176. //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
  177. //sysnb socket(domain int, typ int, proto int) (fd int, err error)
  178. //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
  179. //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETPEERNAME_A
  180. //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETSOCKNAME_A
  181. //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = SYS___RECVFROM_A
  182. //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = SYS___SENDTO_A
  183. //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___RECVMSG_A
  184. //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A
  185. //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP
  186. //sys munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP
  187. //sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL
  188. //sys Access(path string, mode uint32) (err error) = SYS___ACCESS_A
  189. //sys Chdir(path string) (err error) = SYS___CHDIR_A
  190. //sys Chown(path string, uid int, gid int) (err error) = SYS___CHOWN_A
  191. //sys Chmod(path string, mode uint32) (err error) = SYS___CHMOD_A
  192. //sys Creat(path string, mode uint32) (fd int, err error) = SYS___CREAT_A
  193. //sys Dup(oldfd int) (fd int, err error)
  194. //sys Dup2(oldfd int, newfd int) (err error)
  195. //sys Errno2() (er2 int) = SYS___ERRNO2
  196. //sys Err2ad() (eadd *int) = SYS___ERR2AD
  197. //sys Exit(code int)
  198. //sys Fchdir(fd int) (err error)
  199. //sys Fchmod(fd int, mode uint32) (err error)
  200. //sys Fchown(fd int, uid int, gid int) (err error)
  201. //sys FcntlInt(fd uintptr, cmd int, arg int) (retval int, err error) = SYS_FCNTL
  202. //sys fstat(fd int, stat *Stat_LE_t) (err error)
  203. func Fstat(fd int, stat *Stat_t) (err error) {
  204. var statLE Stat_LE_t
  205. err = fstat(fd, &statLE)
  206. copyStat(stat, &statLE)
  207. return
  208. }
  209. //sys Fstatvfs(fd int, stat *Statvfs_t) (err error) = SYS_FSTATVFS
  210. //sys Fsync(fd int) (err error)
  211. //sys Ftruncate(fd int, length int64) (err error)
  212. //sys Getpagesize() (pgsize int) = SYS_GETPAGESIZE
  213. //sys Mprotect(b []byte, prot int) (err error) = SYS_MPROTECT
  214. //sys Msync(b []byte, flags int) (err error) = SYS_MSYNC
  215. //sys Poll(fds []PollFd, timeout int) (n int, err error) = SYS_POLL
  216. //sys Times(tms *Tms) (ticks uintptr, err error) = SYS_TIMES
  217. //sys W_Getmntent(buff *byte, size int) (lastsys int, err error) = SYS_W_GETMNTENT
  218. //sys W_Getmntent_A(buff *byte, size int) (lastsys int, err error) = SYS___W_GETMNTENT_A
  219. //sys mount_LE(path string, filesystem string, fstype string, mtm uint32, parmlen int32, parm string) (err error) = SYS___MOUNT_A
  220. //sys unmount(filesystem string, mtm int) (err error) = SYS___UMOUNT_A
  221. //sys Chroot(path string) (err error) = SYS___CHROOT_A
  222. //sys Select(nmsgsfds int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (ret int, err error) = SYS_SELECT
  223. //sysnb Uname(buf *Utsname) (err error) = SYS___UNAME_A
  224. func Ptsname(fd int) (name string, err error) {
  225. r0, _, e1 := syscall_syscall(SYS___PTSNAME_A, uintptr(fd), 0, 0)
  226. name = u2s(unsafe.Pointer(r0))
  227. if e1 != 0 {
  228. err = errnoErr(e1)
  229. }
  230. return
  231. }
  232. func u2s(cstr unsafe.Pointer) string {
  233. str := (*[1024]uint8)(cstr)
  234. i := 0
  235. for str[i] != 0 {
  236. i++
  237. }
  238. return string(str[:i])
  239. }
  240. func Close(fd int) (err error) {
  241. _, _, e1 := syscall_syscall(SYS_CLOSE, uintptr(fd), 0, 0)
  242. for i := 0; e1 == EAGAIN && i < 10; i++ {
  243. _, _, _ = syscall_syscall(SYS_USLEEP, uintptr(10), 0, 0)
  244. _, _, e1 = syscall_syscall(SYS_CLOSE, uintptr(fd), 0, 0)
  245. }
  246. if e1 != 0 {
  247. err = errnoErr(e1)
  248. }
  249. return
  250. }
  251. var mapper = &mmapper{
  252. active: make(map[*byte][]byte),
  253. mmap: mmap,
  254. munmap: munmap,
  255. }
  256. // Dummy function: there are no semantics for Madvise on z/OS
  257. func Madvise(b []byte, advice int) (err error) {
  258. return
  259. }
  260. func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  261. return mapper.Mmap(fd, offset, length, prot, flags)
  262. }
  263. func Munmap(b []byte) (err error) {
  264. return mapper.Munmap(b)
  265. }
  266. //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A
  267. //sysnb Getegid() (egid int)
  268. //sysnb Geteuid() (uid int)
  269. //sysnb Getgid() (gid int)
  270. //sysnb Getpid() (pid int)
  271. //sysnb Getpgid(pid int) (pgid int, err error) = SYS_GETPGID
  272. func Getpgrp() (pid int) {
  273. pid, _ = Getpgid(0)
  274. return
  275. }
  276. //sysnb Getppid() (pid int)
  277. //sys Getpriority(which int, who int) (prio int, err error)
  278. //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_GETRLIMIT
  279. //sysnb getrusage(who int, rusage *rusage_zos) (err error) = SYS_GETRUSAGE
  280. func Getrusage(who int, rusage *Rusage) (err error) {
  281. var ruz rusage_zos
  282. err = getrusage(who, &ruz)
  283. //Only the first two fields of Rusage are set
  284. rusage.Utime.Sec = ruz.Utime.Sec
  285. rusage.Utime.Usec = int64(ruz.Utime.Usec)
  286. rusage.Stime.Sec = ruz.Stime.Sec
  287. rusage.Stime.Usec = int64(ruz.Stime.Usec)
  288. return
  289. }
  290. //sysnb Getsid(pid int) (sid int, err error) = SYS_GETSID
  291. //sysnb Getuid() (uid int)
  292. //sysnb Kill(pid int, sig Signal) (err error)
  293. //sys Lchown(path string, uid int, gid int) (err error) = SYS___LCHOWN_A
  294. //sys Link(path string, link string) (err error) = SYS___LINK_A
  295. //sys Listen(s int, n int) (err error)
  296. //sys lstat(path string, stat *Stat_LE_t) (err error) = SYS___LSTAT_A
  297. func Lstat(path string, stat *Stat_t) (err error) {
  298. var statLE Stat_LE_t
  299. err = lstat(path, &statLE)
  300. copyStat(stat, &statLE)
  301. return
  302. }
  303. //sys Mkdir(path string, mode uint32) (err error) = SYS___MKDIR_A
  304. //sys Mkfifo(path string, mode uint32) (err error) = SYS___MKFIFO_A
  305. //sys Mknod(path string, mode uint32, dev int) (err error) = SYS___MKNOD_A
  306. //sys Pread(fd int, p []byte, offset int64) (n int, err error)
  307. //sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
  308. //sys Readlink(path string, buf []byte) (n int, err error) = SYS___READLINK_A
  309. //sys Rename(from string, to string) (err error) = SYS___RENAME_A
  310. //sys Rmdir(path string) (err error) = SYS___RMDIR_A
  311. //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
  312. //sys Setpriority(which int, who int, prio int) (err error)
  313. //sysnb Setpgid(pid int, pgid int) (err error) = SYS_SETPGID
  314. //sysnb Setrlimit(resource int, lim *Rlimit) (err error)
  315. //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID
  316. //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID
  317. //sysnb Setsid() (pid int, err error) = SYS_SETSID
  318. //sys Setuid(uid int) (err error) = SYS_SETUID
  319. //sys Setgid(uid int) (err error) = SYS_SETGID
  320. //sys Shutdown(fd int, how int) (err error)
  321. //sys stat(path string, statLE *Stat_LE_t) (err error) = SYS___STAT_A
  322. func Stat(path string, sta *Stat_t) (err error) {
  323. var statLE Stat_LE_t
  324. err = stat(path, &statLE)
  325. copyStat(sta, &statLE)
  326. return
  327. }
  328. //sys Symlink(path string, link string) (err error) = SYS___SYMLINK_A
  329. //sys Sync() = SYS_SYNC
  330. //sys Truncate(path string, length int64) (err error) = SYS___TRUNCATE_A
  331. //sys Tcgetattr(fildes int, termptr *Termios) (err error) = SYS_TCGETATTR
  332. //sys Tcsetattr(fildes int, when int, termptr *Termios) (err error) = SYS_TCSETATTR
  333. //sys Umask(mask int) (oldmask int)
  334. //sys Unlink(path string) (err error) = SYS___UNLINK_A
  335. //sys Utime(path string, utim *Utimbuf) (err error) = SYS___UTIME_A
  336. //sys open(path string, mode int, perm uint32) (fd int, err error) = SYS___OPEN_A
  337. func Open(path string, mode int, perm uint32) (fd int, err error) {
  338. return open(path, mode, perm)
  339. }
  340. func Mkfifoat(dirfd int, path string, mode uint32) (err error) {
  341. wd, err := Getwd()
  342. if err != nil {
  343. return err
  344. }
  345. if err := Fchdir(dirfd); err != nil {
  346. return err
  347. }
  348. defer Chdir(wd)
  349. return Mkfifo(path, mode)
  350. }
  351. //sys remove(path string) (err error)
  352. func Remove(path string) error {
  353. return remove(path)
  354. }
  355. const ImplementsGetwd = true
  356. func Getcwd(buf []byte) (n int, err error) {
  357. var p unsafe.Pointer
  358. if len(buf) > 0 {
  359. p = unsafe.Pointer(&buf[0])
  360. } else {
  361. p = unsafe.Pointer(&_zero)
  362. }
  363. _, _, e := syscall_syscall(SYS___GETCWD_A, uintptr(p), uintptr(len(buf)), 0)
  364. n = clen(buf) + 1
  365. if e != 0 {
  366. err = errnoErr(e)
  367. }
  368. return
  369. }
  370. func Getwd() (wd string, err error) {
  371. var buf [PathMax]byte
  372. n, err := Getcwd(buf[0:])
  373. if err != nil {
  374. return "", err
  375. }
  376. // Getcwd returns the number of bytes written to buf, including the NUL.
  377. if n < 1 || n > len(buf) || buf[n-1] != 0 {
  378. return "", EINVAL
  379. }
  380. return string(buf[0 : n-1]), nil
  381. }
  382. func Getgroups() (gids []int, err error) {
  383. n, err := getgroups(0, nil)
  384. if err != nil {
  385. return nil, err
  386. }
  387. if n == 0 {
  388. return nil, nil
  389. }
  390. // Sanity check group count. Max is 1<<16 on Linux.
  391. if n < 0 || n > 1<<20 {
  392. return nil, EINVAL
  393. }
  394. a := make([]_Gid_t, n)
  395. n, err = getgroups(n, &a[0])
  396. if err != nil {
  397. return nil, err
  398. }
  399. gids = make([]int, n)
  400. for i, v := range a[0:n] {
  401. gids[i] = int(v)
  402. }
  403. return
  404. }
  405. func Setgroups(gids []int) (err error) {
  406. if len(gids) == 0 {
  407. return setgroups(0, nil)
  408. }
  409. a := make([]_Gid_t, len(gids))
  410. for i, v := range gids {
  411. a[i] = _Gid_t(v)
  412. }
  413. return setgroups(len(a), &a[0])
  414. }
  415. func gettid() uint64
  416. func Gettid() (tid int) {
  417. return int(gettid())
  418. }
  419. type WaitStatus uint32
  420. // Wait status is 7 bits at bottom, either 0 (exited),
  421. // 0x7F (stopped), or a signal number that caused an exit.
  422. // The 0x80 bit is whether there was a core dump.
  423. // An extra number (exit code, signal causing a stop)
  424. // is in the high bits. At least that's the idea.
  425. // There are various irregularities. For example, the
  426. // "continued" status is 0xFFFF, distinguishing itself
  427. // from stopped via the core dump bit.
  428. const (
  429. mask = 0x7F
  430. core = 0x80
  431. exited = 0x00
  432. stopped = 0x7F
  433. shift = 8
  434. )
  435. func (w WaitStatus) Exited() bool { return w&mask == exited }
  436. func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }
  437. func (w WaitStatus) Stopped() bool { return w&0xFF == stopped }
  438. func (w WaitStatus) Continued() bool { return w == 0xFFFF }
  439. func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
  440. func (w WaitStatus) ExitStatus() int {
  441. if !w.Exited() {
  442. return -1
  443. }
  444. return int(w>>shift) & 0xFF
  445. }
  446. func (w WaitStatus) Signal() Signal {
  447. if !w.Signaled() {
  448. return -1
  449. }
  450. return Signal(w & mask)
  451. }
  452. func (w WaitStatus) StopSignal() Signal {
  453. if !w.Stopped() {
  454. return -1
  455. }
  456. return Signal(w>>shift) & 0xFF
  457. }
  458. func (w WaitStatus) TrapCause() int { return -1 }
  459. //sys waitpid(pid int, wstatus *_C_int, options int) (wpid int, err error)
  460. func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
  461. // TODO(mundaym): z/OS doesn't have wait4. I don't think getrusage does what we want.
  462. // At the moment rusage will not be touched.
  463. var status _C_int
  464. wpid, err = waitpid(pid, &status, options)
  465. if wstatus != nil {
  466. *wstatus = WaitStatus(status)
  467. }
  468. return
  469. }
  470. //sysnb gettimeofday(tv *timeval_zos) (err error)
  471. func Gettimeofday(tv *Timeval) (err error) {
  472. var tvz timeval_zos
  473. err = gettimeofday(&tvz)
  474. tv.Sec = tvz.Sec
  475. tv.Usec = int64(tvz.Usec)
  476. return
  477. }
  478. func Time(t *Time_t) (tt Time_t, err error) {
  479. var tv Timeval
  480. err = Gettimeofday(&tv)
  481. if err != nil {
  482. return 0, err
  483. }
  484. if t != nil {
  485. *t = Time_t(tv.Sec)
  486. }
  487. return Time_t(tv.Sec), nil
  488. }
  489. func setTimespec(sec, nsec int64) Timespec {
  490. return Timespec{Sec: sec, Nsec: nsec}
  491. }
  492. func setTimeval(sec, usec int64) Timeval { //fix
  493. return Timeval{Sec: sec, Usec: usec}
  494. }
  495. //sysnb pipe(p *[2]_C_int) (err error)
  496. func Pipe(p []int) (err error) {
  497. if len(p) != 2 {
  498. return EINVAL
  499. }
  500. var pp [2]_C_int
  501. err = pipe(&pp)
  502. if err == nil {
  503. p[0] = int(pp[0])
  504. p[1] = int(pp[1])
  505. }
  506. return
  507. }
  508. //sys utimes(path string, timeval *[2]Timeval) (err error) = SYS___UTIMES_A
  509. func Utimes(path string, tv []Timeval) (err error) {
  510. if len(tv) != 2 {
  511. return EINVAL
  512. }
  513. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  514. }
  515. func UtimesNano(path string, ts []Timespec) error {
  516. if len(ts) != 2 {
  517. return EINVAL
  518. }
  519. // Not as efficient as it could be because Timespec and
  520. // Timeval have different types in the different OSes
  521. tv := [2]Timeval{
  522. NsecToTimeval(TimespecToNsec(ts[0])),
  523. NsecToTimeval(TimespecToNsec(ts[1])),
  524. }
  525. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  526. }
  527. func Getsockname(fd int) (sa Sockaddr, err error) {
  528. var rsa RawSockaddrAny
  529. var len _Socklen = SizeofSockaddrAny
  530. if err = getsockname(fd, &rsa, &len); err != nil {
  531. return
  532. }
  533. // TODO(neeilan) : Remove this 0 ( added to get sys/unix compiling on z/OS )
  534. return anyToSockaddr(0, &rsa)
  535. }
  536. const (
  537. // identifier constants
  538. nwmHeaderIdentifier = 0xd5e6d4c8
  539. nwmFilterIdentifier = 0xd5e6d4c6
  540. nwmTCPConnIdentifier = 0xd5e6d4c3
  541. nwmRecHeaderIdentifier = 0xd5e6d4d9
  542. nwmIPStatsIdentifier = 0xd5e6d4c9d7e2e340
  543. nwmIPGStatsIdentifier = 0xd5e6d4c9d7c7e2e3
  544. nwmTCPStatsIdentifier = 0xd5e6d4e3c3d7e2e3
  545. nwmUDPStatsIdentifier = 0xd5e6d4e4c4d7e2e3
  546. nwmICMPGStatsEntry = 0xd5e6d4c9c3d4d7c7
  547. nwmICMPTStatsEntry = 0xd5e6d4c9c3d4d7e3
  548. // nwmHeader constants
  549. nwmVersion1 = 1
  550. nwmVersion2 = 2
  551. nwmCurrentVer = 2
  552. nwmTCPConnType = 1
  553. nwmGlobalStatsType = 14
  554. // nwmFilter constants
  555. nwmFilterLclAddrMask = 0x20000000 // Local address
  556. nwmFilterSrcAddrMask = 0x20000000 // Source address
  557. nwmFilterLclPortMask = 0x10000000 // Local port
  558. nwmFilterSrcPortMask = 0x10000000 // Source port
  559. // nwmConnEntry constants
  560. nwmTCPStateClosed = 1
  561. nwmTCPStateListen = 2
  562. nwmTCPStateSynSent = 3
  563. nwmTCPStateSynRcvd = 4
  564. nwmTCPStateEstab = 5
  565. nwmTCPStateFinWait1 = 6
  566. nwmTCPStateFinWait2 = 7
  567. nwmTCPStateClosWait = 8
  568. nwmTCPStateLastAck = 9
  569. nwmTCPStateClosing = 10
  570. nwmTCPStateTimeWait = 11
  571. nwmTCPStateDeletTCB = 12
  572. // Existing constants on linux
  573. BPF_TCP_CLOSE = 1
  574. BPF_TCP_LISTEN = 2
  575. BPF_TCP_SYN_SENT = 3
  576. BPF_TCP_SYN_RECV = 4
  577. BPF_TCP_ESTABLISHED = 5
  578. BPF_TCP_FIN_WAIT1 = 6
  579. BPF_TCP_FIN_WAIT2 = 7
  580. BPF_TCP_CLOSE_WAIT = 8
  581. BPF_TCP_LAST_ACK = 9
  582. BPF_TCP_CLOSING = 10
  583. BPF_TCP_TIME_WAIT = 11
  584. BPF_TCP_NEW_SYN_RECV = -1
  585. BPF_TCP_MAX_STATES = -2
  586. )
  587. type nwmTriplet struct {
  588. offset uint32
  589. length uint32
  590. number uint32
  591. }
  592. type nwmQuadruplet struct {
  593. offset uint32
  594. length uint32
  595. number uint32
  596. match uint32
  597. }
  598. type nwmHeader struct {
  599. ident uint32
  600. length uint32
  601. version uint16
  602. nwmType uint16
  603. bytesNeeded uint32
  604. options uint32
  605. _ [16]byte
  606. inputDesc nwmTriplet
  607. outputDesc nwmQuadruplet
  608. }
  609. type nwmFilter struct {
  610. ident uint32
  611. flags uint32
  612. resourceName [8]byte
  613. resourceId uint32
  614. listenerId uint32
  615. local [28]byte // union of sockaddr4 and sockaddr6
  616. remote [28]byte // union of sockaddr4 and sockaddr6
  617. _ uint16
  618. _ uint16
  619. asid uint16
  620. _ [2]byte
  621. tnLuName [8]byte
  622. tnMonGrp uint32
  623. tnAppl [8]byte
  624. applData [40]byte
  625. nInterface [16]byte
  626. dVipa [16]byte
  627. dVipaPfx uint16
  628. dVipaPort uint16
  629. dVipaFamily byte
  630. _ [3]byte
  631. destXCF [16]byte
  632. destXCFPfx uint16
  633. destXCFFamily byte
  634. _ [1]byte
  635. targIP [16]byte
  636. targIPPfx uint16
  637. targIPFamily byte
  638. _ [1]byte
  639. _ [20]byte
  640. }
  641. type nwmRecHeader struct {
  642. ident uint32
  643. length uint32
  644. number byte
  645. _ [3]byte
  646. }
  647. type nwmTCPStatsEntry struct {
  648. ident uint64
  649. currEstab uint32
  650. activeOpened uint32
  651. passiveOpened uint32
  652. connClosed uint32
  653. estabResets uint32
  654. attemptFails uint32
  655. passiveDrops uint32
  656. timeWaitReused uint32
  657. inSegs uint64
  658. predictAck uint32
  659. predictData uint32
  660. inDupAck uint32
  661. inBadSum uint32
  662. inBadLen uint32
  663. inShort uint32
  664. inDiscOldTime uint32
  665. inAllBeforeWin uint32
  666. inSomeBeforeWin uint32
  667. inAllAfterWin uint32
  668. inSomeAfterWin uint32
  669. inOutOfOrder uint32
  670. inAfterClose uint32
  671. inWinProbes uint32
  672. inWinUpdates uint32
  673. outWinUpdates uint32
  674. outSegs uint64
  675. outDelayAcks uint32
  676. outRsts uint32
  677. retransSegs uint32
  678. retransTimeouts uint32
  679. retransDrops uint32
  680. pmtuRetrans uint32
  681. pmtuErrors uint32
  682. outWinProbes uint32
  683. probeDrops uint32
  684. keepAliveProbes uint32
  685. keepAliveDrops uint32
  686. finwait2Drops uint32
  687. acceptCount uint64
  688. inBulkQSegs uint64
  689. inDiscards uint64
  690. connFloods uint32
  691. connStalls uint32
  692. cfgEphemDef uint16
  693. ephemInUse uint16
  694. ephemHiWater uint16
  695. flags byte
  696. _ [1]byte
  697. ephemExhaust uint32
  698. smcRCurrEstabLnks uint32
  699. smcRLnkActTimeOut uint32
  700. smcRActLnkOpened uint32
  701. smcRPasLnkOpened uint32
  702. smcRLnksClosed uint32
  703. smcRCurrEstab uint32
  704. smcRActiveOpened uint32
  705. smcRPassiveOpened uint32
  706. smcRConnClosed uint32
  707. smcRInSegs uint64
  708. smcROutSegs uint64
  709. smcRInRsts uint32
  710. smcROutRsts uint32
  711. smcDCurrEstabLnks uint32
  712. smcDActLnkOpened uint32
  713. smcDPasLnkOpened uint32
  714. smcDLnksClosed uint32
  715. smcDCurrEstab uint32
  716. smcDActiveOpened uint32
  717. smcDPassiveOpened uint32
  718. smcDConnClosed uint32
  719. smcDInSegs uint64
  720. smcDOutSegs uint64
  721. smcDInRsts uint32
  722. smcDOutRsts uint32
  723. }
  724. type nwmConnEntry struct {
  725. ident uint32
  726. local [28]byte // union of sockaddr4 and sockaddr6
  727. remote [28]byte // union of sockaddr4 and sockaddr6
  728. startTime [8]byte // uint64, changed to prevent padding from being inserted
  729. lastActivity [8]byte // uint64
  730. bytesIn [8]byte // uint64
  731. bytesOut [8]byte // uint64
  732. inSegs [8]byte // uint64
  733. outSegs [8]byte // uint64
  734. state uint16
  735. activeOpen byte
  736. flag01 byte
  737. outBuffered uint32
  738. inBuffered uint32
  739. maxSndWnd uint32
  740. reXmtCount uint32
  741. congestionWnd uint32
  742. ssThresh uint32
  743. roundTripTime uint32
  744. roundTripVar uint32
  745. sendMSS uint32
  746. sndWnd uint32
  747. rcvBufSize uint32
  748. sndBufSize uint32
  749. outOfOrderCount uint32
  750. lcl0WindowCount uint32
  751. rmt0WindowCount uint32
  752. dupacks uint32
  753. flag02 byte
  754. sockOpt6Cont byte
  755. asid uint16
  756. resourceName [8]byte
  757. resourceId uint32
  758. subtask uint32
  759. sockOpt byte
  760. sockOpt6 byte
  761. clusterConnFlag byte
  762. proto byte
  763. targetAppl [8]byte
  764. luName [8]byte
  765. clientUserId [8]byte
  766. logMode [8]byte
  767. timeStamp uint32
  768. timeStampAge uint32
  769. serverResourceId uint32
  770. intfName [16]byte
  771. ttlsStatPol byte
  772. ttlsStatConn byte
  773. ttlsSSLProt uint16
  774. ttlsNegCiph [2]byte
  775. ttlsSecType byte
  776. ttlsFIPS140Mode byte
  777. ttlsUserID [8]byte
  778. applData [40]byte
  779. inOldestTime [8]byte // uint64
  780. outOldestTime [8]byte // uint64
  781. tcpTrustedPartner byte
  782. _ [3]byte
  783. bulkDataIntfName [16]byte
  784. ttlsNegCiph4 [4]byte
  785. smcReason uint32
  786. lclSMCLinkId uint32
  787. rmtSMCLinkId uint32
  788. smcStatus byte
  789. smcFlags byte
  790. _ [2]byte
  791. rcvWnd uint32
  792. lclSMCBufSz uint32
  793. rmtSMCBufSz uint32
  794. ttlsSessID [32]byte
  795. ttlsSessIDLen int16
  796. _ [1]byte
  797. smcDStatus byte
  798. smcDReason uint32
  799. }
  800. var svcNameTable [][]byte = [][]byte{
  801. []byte("\xc5\xe9\xc2\xd5\xd4\xc9\xc6\xf4"), // svc_EZBNMIF4
  802. }
  803. const (
  804. svc_EZBNMIF4 = 0
  805. )
  806. func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {
  807. jobname := []byte("\x5c\x40\x40\x40\x40\x40\x40\x40") // "*"
  808. responseBuffer := [4096]byte{0}
  809. var bufferAlet, reasonCode uint32 = 0, 0
  810. var bufferLen, returnValue, returnCode int32 = 4096, 0, 0
  811. dsa := [18]uint64{0}
  812. var argv [7]unsafe.Pointer
  813. argv[0] = unsafe.Pointer(&jobname[0])
  814. argv[1] = unsafe.Pointer(&responseBuffer[0])
  815. argv[2] = unsafe.Pointer(&bufferAlet)
  816. argv[3] = unsafe.Pointer(&bufferLen)
  817. argv[4] = unsafe.Pointer(&returnValue)
  818. argv[5] = unsafe.Pointer(&returnCode)
  819. argv[6] = unsafe.Pointer(&reasonCode)
  820. request := (*struct {
  821. header nwmHeader
  822. filter nwmFilter
  823. })(unsafe.Pointer(&responseBuffer[0]))
  824. EZBNMIF4 := svcLoad(&svcNameTable[svc_EZBNMIF4][0])
  825. if EZBNMIF4 == nil {
  826. return nil, errnoErr(EINVAL)
  827. }
  828. // GetGlobalStats EZBNMIF4 call
  829. request.header.ident = nwmHeaderIdentifier
  830. request.header.length = uint32(unsafe.Sizeof(request.header))
  831. request.header.version = nwmCurrentVer
  832. request.header.nwmType = nwmGlobalStatsType
  833. request.header.options = 0x80000000
  834. svcCall(EZBNMIF4, &argv[0], &dsa[0])
  835. // outputDesc field is filled by EZBNMIF4 on success
  836. if returnCode != 0 || request.header.outputDesc.offset == 0 {
  837. return nil, errnoErr(EINVAL)
  838. }
  839. // Check that EZBNMIF4 returned a nwmRecHeader
  840. recHeader := (*nwmRecHeader)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset]))
  841. if recHeader.ident != nwmRecHeaderIdentifier {
  842. return nil, errnoErr(EINVAL)
  843. }
  844. // Parse nwmTriplets to get offsets of returned entries
  845. var sections []*uint64
  846. var sectionDesc *nwmTriplet = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[0]))
  847. for i := uint32(0); i < uint32(recHeader.number); i++ {
  848. offset := request.header.outputDesc.offset + uint32(unsafe.Sizeof(*recHeader)) + i*uint32(unsafe.Sizeof(*sectionDesc))
  849. sectionDesc = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[offset]))
  850. for j := uint32(0); j < sectionDesc.number; j++ {
  851. offset = request.header.outputDesc.offset + sectionDesc.offset + j*sectionDesc.length
  852. sections = append(sections, (*uint64)(unsafe.Pointer(&responseBuffer[offset])))
  853. }
  854. }
  855. // Find nwmTCPStatsEntry in returned entries
  856. var tcpStats *nwmTCPStatsEntry = nil
  857. for _, ptr := range sections {
  858. switch *ptr {
  859. case nwmTCPStatsIdentifier:
  860. if tcpStats != nil {
  861. return nil, errnoErr(EINVAL)
  862. }
  863. tcpStats = (*nwmTCPStatsEntry)(unsafe.Pointer(ptr))
  864. case nwmIPStatsIdentifier:
  865. case nwmIPGStatsIdentifier:
  866. case nwmUDPStatsIdentifier:
  867. case nwmICMPGStatsEntry:
  868. case nwmICMPTStatsEntry:
  869. default:
  870. return nil, errnoErr(EINVAL)
  871. }
  872. }
  873. if tcpStats == nil {
  874. return nil, errnoErr(EINVAL)
  875. }
  876. // GetConnectionDetail EZBNMIF4 call
  877. responseBuffer = [4096]byte{0}
  878. dsa = [18]uint64{0}
  879. bufferAlet, reasonCode = 0, 0
  880. bufferLen, returnValue, returnCode = 4096, 0, 0
  881. nameptr := (*uint32)(unsafe.Pointer(uintptr(0x21c))) // Get jobname of current process
  882. nameptr = (*uint32)(unsafe.Pointer(uintptr(*nameptr + 12)))
  883. argv[0] = unsafe.Pointer(uintptr(*nameptr))
  884. request.header.ident = nwmHeaderIdentifier
  885. request.header.length = uint32(unsafe.Sizeof(request.header))
  886. request.header.version = nwmCurrentVer
  887. request.header.nwmType = nwmTCPConnType
  888. request.header.options = 0x80000000
  889. request.filter.ident = nwmFilterIdentifier
  890. var localSockaddr RawSockaddrAny
  891. socklen := _Socklen(SizeofSockaddrAny)
  892. err := getsockname(fd, &localSockaddr, &socklen)
  893. if err != nil {
  894. return nil, errnoErr(EINVAL)
  895. }
  896. if localSockaddr.Addr.Family == AF_INET {
  897. localSockaddr := (*RawSockaddrInet4)(unsafe.Pointer(&localSockaddr.Addr))
  898. localSockFilter := (*RawSockaddrInet4)(unsafe.Pointer(&request.filter.local[0]))
  899. localSockFilter.Family = AF_INET
  900. var i int
  901. for i = 0; i < 4; i++ {
  902. if localSockaddr.Addr[i] != 0 {
  903. break
  904. }
  905. }
  906. if i != 4 {
  907. request.filter.flags |= nwmFilterLclAddrMask
  908. for i = 0; i < 4; i++ {
  909. localSockFilter.Addr[i] = localSockaddr.Addr[i]
  910. }
  911. }
  912. if localSockaddr.Port != 0 {
  913. request.filter.flags |= nwmFilterLclPortMask
  914. localSockFilter.Port = localSockaddr.Port
  915. }
  916. } else if localSockaddr.Addr.Family == AF_INET6 {
  917. localSockaddr := (*RawSockaddrInet6)(unsafe.Pointer(&localSockaddr.Addr))
  918. localSockFilter := (*RawSockaddrInet6)(unsafe.Pointer(&request.filter.local[0]))
  919. localSockFilter.Family = AF_INET6
  920. var i int
  921. for i = 0; i < 16; i++ {
  922. if localSockaddr.Addr[i] != 0 {
  923. break
  924. }
  925. }
  926. if i != 16 {
  927. request.filter.flags |= nwmFilterLclAddrMask
  928. for i = 0; i < 16; i++ {
  929. localSockFilter.Addr[i] = localSockaddr.Addr[i]
  930. }
  931. }
  932. if localSockaddr.Port != 0 {
  933. request.filter.flags |= nwmFilterLclPortMask
  934. localSockFilter.Port = localSockaddr.Port
  935. }
  936. }
  937. svcCall(EZBNMIF4, &argv[0], &dsa[0])
  938. // outputDesc field is filled by EZBNMIF4 on success
  939. if returnCode != 0 || request.header.outputDesc.offset == 0 {
  940. return nil, errnoErr(EINVAL)
  941. }
  942. // Check that EZBNMIF4 returned a nwmConnEntry
  943. conn := (*nwmConnEntry)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset]))
  944. if conn.ident != nwmTCPConnIdentifier {
  945. return nil, errnoErr(EINVAL)
  946. }
  947. // Copy data from the returned data structures into tcpInfo
  948. // Stats from nwmConnEntry are specific to that connection.
  949. // Stats from nwmTCPStatsEntry are global (to the interface?)
  950. // Fields may not be an exact match. Some fields have no equivalent.
  951. var tcpinfo TCPInfo
  952. tcpinfo.State = uint8(conn.state)
  953. tcpinfo.Ca_state = 0 // dummy
  954. tcpinfo.Retransmits = uint8(tcpStats.retransSegs)
  955. tcpinfo.Probes = uint8(tcpStats.outWinProbes)
  956. tcpinfo.Backoff = 0 // dummy
  957. tcpinfo.Options = 0 // dummy
  958. tcpinfo.Rto = tcpStats.retransTimeouts
  959. tcpinfo.Ato = tcpStats.outDelayAcks
  960. tcpinfo.Snd_mss = conn.sendMSS
  961. tcpinfo.Rcv_mss = conn.sendMSS // dummy
  962. tcpinfo.Unacked = 0 // dummy
  963. tcpinfo.Sacked = 0 // dummy
  964. tcpinfo.Lost = 0 // dummy
  965. tcpinfo.Retrans = conn.reXmtCount
  966. tcpinfo.Fackets = 0 // dummy
  967. tcpinfo.Last_data_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.lastActivity[0])))
  968. tcpinfo.Last_ack_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.outOldestTime[0])))
  969. tcpinfo.Last_data_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0])))
  970. tcpinfo.Last_ack_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0])))
  971. tcpinfo.Pmtu = conn.sendMSS // dummy, NWMIfRouteMtu is a candidate
  972. tcpinfo.Rcv_ssthresh = conn.ssThresh
  973. tcpinfo.Rtt = conn.roundTripTime
  974. tcpinfo.Rttvar = conn.roundTripVar
  975. tcpinfo.Snd_ssthresh = conn.ssThresh // dummy
  976. tcpinfo.Snd_cwnd = conn.congestionWnd
  977. tcpinfo.Advmss = conn.sendMSS // dummy
  978. tcpinfo.Reordering = 0 // dummy
  979. tcpinfo.Rcv_rtt = conn.roundTripTime // dummy
  980. tcpinfo.Rcv_space = conn.sendMSS // dummy
  981. tcpinfo.Total_retrans = conn.reXmtCount
  982. svcUnload(&svcNameTable[svc_EZBNMIF4][0], EZBNMIF4)
  983. return &tcpinfo, nil
  984. }
  985. // GetsockoptString returns the string value of the socket option opt for the
  986. // socket associated with fd at the given socket level.
  987. func GetsockoptString(fd, level, opt int) (string, error) {
  988. buf := make([]byte, 256)
  989. vallen := _Socklen(len(buf))
  990. err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
  991. if err != nil {
  992. return "", err
  993. }
  994. return string(buf[:vallen-1]), nil
  995. }
  996. func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
  997. var msg Msghdr
  998. var rsa RawSockaddrAny
  999. msg.Name = (*byte)(unsafe.Pointer(&rsa))
  1000. msg.Namelen = SizeofSockaddrAny
  1001. var iov Iovec
  1002. if len(p) > 0 {
  1003. iov.Base = (*byte)(unsafe.Pointer(&p[0]))
  1004. iov.SetLen(len(p))
  1005. }
  1006. var dummy byte
  1007. if len(oob) > 0 {
  1008. // receive at least one normal byte
  1009. if len(p) == 0 {
  1010. iov.Base = &dummy
  1011. iov.SetLen(1)
  1012. }
  1013. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  1014. msg.SetControllen(len(oob))
  1015. }
  1016. msg.Iov = &iov
  1017. msg.Iovlen = 1
  1018. if n, err = recvmsg(fd, &msg, flags); err != nil {
  1019. return
  1020. }
  1021. oobn = int(msg.Controllen)
  1022. recvflags = int(msg.Flags)
  1023. // source address is only specified if the socket is unconnected
  1024. if rsa.Addr.Family != AF_UNSPEC {
  1025. // TODO(neeilan): Remove 0 arg added to get this compiling on z/OS
  1026. from, err = anyToSockaddr(0, &rsa)
  1027. }
  1028. return
  1029. }
  1030. func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
  1031. _, err = SendmsgN(fd, p, oob, to, flags)
  1032. return
  1033. }
  1034. func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
  1035. var ptr unsafe.Pointer
  1036. var salen _Socklen
  1037. if to != nil {
  1038. var err error
  1039. ptr, salen, err = to.sockaddr()
  1040. if err != nil {
  1041. return 0, err
  1042. }
  1043. }
  1044. var msg Msghdr
  1045. msg.Name = (*byte)(unsafe.Pointer(ptr))
  1046. msg.Namelen = int32(salen)
  1047. var iov Iovec
  1048. if len(p) > 0 {
  1049. iov.Base = (*byte)(unsafe.Pointer(&p[0]))
  1050. iov.SetLen(len(p))
  1051. }
  1052. var dummy byte
  1053. if len(oob) > 0 {
  1054. // send at least one normal byte
  1055. if len(p) == 0 {
  1056. iov.Base = &dummy
  1057. iov.SetLen(1)
  1058. }
  1059. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  1060. msg.SetControllen(len(oob))
  1061. }
  1062. msg.Iov = &iov
  1063. msg.Iovlen = 1
  1064. if n, err = sendmsg(fd, &msg, flags); err != nil {
  1065. return 0, err
  1066. }
  1067. if len(oob) > 0 && len(p) == 0 {
  1068. n = 0
  1069. }
  1070. return n, nil
  1071. }
  1072. func Opendir(name string) (uintptr, error) {
  1073. p, err := BytePtrFromString(name)
  1074. if err != nil {
  1075. return 0, err
  1076. }
  1077. dir, _, e := syscall_syscall(SYS___OPENDIR_A, uintptr(unsafe.Pointer(p)), 0, 0)
  1078. runtime.KeepAlive(unsafe.Pointer(p))
  1079. if e != 0 {
  1080. err = errnoErr(e)
  1081. }
  1082. return dir, err
  1083. }
  1084. // clearsyscall.Errno resets the errno value to 0.
  1085. func clearErrno()
  1086. func Readdir(dir uintptr) (*Dirent, error) {
  1087. var ent Dirent
  1088. var res uintptr
  1089. // __readdir_r_a returns errno at the end of the directory stream, rather than 0.
  1090. // Therefore to avoid false positives we clear errno before calling it.
  1091. // TODO(neeilan): Commented this out to get sys/unix compiling on z/OS. Uncomment and fix. Error: "undefined: clearsyscall"
  1092. //clearsyscall.Errno() // TODO(mundaym): check pre-emption rules.
  1093. e, _, _ := syscall_syscall(SYS___READDIR_R_A, dir, uintptr(unsafe.Pointer(&ent)), uintptr(unsafe.Pointer(&res)))
  1094. var err error
  1095. if e != 0 {
  1096. err = errnoErr(Errno(e))
  1097. }
  1098. if res == 0 {
  1099. return nil, err
  1100. }
  1101. return &ent, err
  1102. }
  1103. func Closedir(dir uintptr) error {
  1104. _, _, e := syscall_syscall(SYS_CLOSEDIR, dir, 0, 0)
  1105. if e != 0 {
  1106. return errnoErr(e)
  1107. }
  1108. return nil
  1109. }
  1110. func Seekdir(dir uintptr, pos int) {
  1111. _, _, _ = syscall_syscall(SYS_SEEKDIR, dir, uintptr(pos), 0)
  1112. }
  1113. func Telldir(dir uintptr) (int, error) {
  1114. p, _, e := syscall_syscall(SYS_TELLDIR, dir, 0, 0)
  1115. pos := int(p)
  1116. if pos == -1 {
  1117. return pos, errnoErr(e)
  1118. }
  1119. return pos, nil
  1120. }
  1121. // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
  1122. func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
  1123. // struct flock is packed on z/OS. We can't emulate that in Go so
  1124. // instead we pack it here.
  1125. var flock [24]byte
  1126. *(*int16)(unsafe.Pointer(&flock[0])) = lk.Type
  1127. *(*int16)(unsafe.Pointer(&flock[2])) = lk.Whence
  1128. *(*int64)(unsafe.Pointer(&flock[4])) = lk.Start
  1129. *(*int64)(unsafe.Pointer(&flock[12])) = lk.Len
  1130. *(*int32)(unsafe.Pointer(&flock[20])) = lk.Pid
  1131. _, _, errno := syscall_syscall(SYS_FCNTL, fd, uintptr(cmd), uintptr(unsafe.Pointer(&flock)))
  1132. lk.Type = *(*int16)(unsafe.Pointer(&flock[0]))
  1133. lk.Whence = *(*int16)(unsafe.Pointer(&flock[2]))
  1134. lk.Start = *(*int64)(unsafe.Pointer(&flock[4]))
  1135. lk.Len = *(*int64)(unsafe.Pointer(&flock[12]))
  1136. lk.Pid = *(*int32)(unsafe.Pointer(&flock[20]))
  1137. if errno == 0 {
  1138. return nil
  1139. }
  1140. return errno
  1141. }
  1142. func Flock(fd int, how int) error {
  1143. var flock_type int16
  1144. var fcntl_cmd int
  1145. switch how {
  1146. case LOCK_SH | LOCK_NB:
  1147. flock_type = F_RDLCK
  1148. fcntl_cmd = F_SETLK
  1149. case LOCK_EX | LOCK_NB:
  1150. flock_type = F_WRLCK
  1151. fcntl_cmd = F_SETLK
  1152. case LOCK_EX:
  1153. flock_type = F_WRLCK
  1154. fcntl_cmd = F_SETLKW
  1155. case LOCK_UN:
  1156. flock_type = F_UNLCK
  1157. fcntl_cmd = F_SETLKW
  1158. default:
  1159. }
  1160. flock := Flock_t{
  1161. Type: int16(flock_type),
  1162. Whence: int16(0),
  1163. Start: int64(0),
  1164. Len: int64(0),
  1165. Pid: int32(Getppid()),
  1166. }
  1167. err := FcntlFlock(uintptr(fd), fcntl_cmd, &flock)
  1168. return err
  1169. }
  1170. func Mlock(b []byte) (err error) {
  1171. _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0)
  1172. if e1 != 0 {
  1173. err = errnoErr(e1)
  1174. }
  1175. return
  1176. }
  1177. func Mlock2(b []byte, flags int) (err error) {
  1178. _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0)
  1179. if e1 != 0 {
  1180. err = errnoErr(e1)
  1181. }
  1182. return
  1183. }
  1184. func Mlockall(flags int) (err error) {
  1185. _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_NONSWAP, 0, 0)
  1186. if e1 != 0 {
  1187. err = errnoErr(e1)
  1188. }
  1189. return
  1190. }
  1191. func Munlock(b []byte) (err error) {
  1192. _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_SWAP, 0, 0)
  1193. if e1 != 0 {
  1194. err = errnoErr(e1)
  1195. }
  1196. return
  1197. }
  1198. func Munlockall() (err error) {
  1199. _, _, e1 := syscall_syscall(SYS___MLOCKALL, _BPX_SWAP, 0, 0)
  1200. if e1 != 0 {
  1201. err = errnoErr(e1)
  1202. }
  1203. return
  1204. }
  1205. func ClockGettime(clockid int32, ts *Timespec) error {
  1206. var ticks_per_sec uint32 = 100 //TODO(kenan): value is currently hardcoded; need sysconf() call otherwise
  1207. var nsec_per_sec int64 = 1000000000
  1208. if ts == nil {
  1209. return EFAULT
  1210. }
  1211. if clockid == CLOCK_REALTIME || clockid == CLOCK_MONOTONIC {
  1212. var nanotime int64 = runtime.Nanotime1()
  1213. ts.Sec = nanotime / nsec_per_sec
  1214. ts.Nsec = nanotime % nsec_per_sec
  1215. } else if clockid == CLOCK_PROCESS_CPUTIME_ID || clockid == CLOCK_THREAD_CPUTIME_ID {
  1216. var tm Tms
  1217. _, err := Times(&tm)
  1218. if err != nil {
  1219. return EFAULT
  1220. }
  1221. ts.Sec = int64(tm.Utime / ticks_per_sec)
  1222. ts.Nsec = int64(tm.Utime) * nsec_per_sec / int64(ticks_per_sec)
  1223. } else {
  1224. return EINVAL
  1225. }
  1226. return nil
  1227. }
  1228. func Statfs(path string, stat *Statfs_t) (err error) {
  1229. fd, err := open(path, O_RDONLY, 0)
  1230. defer Close(fd)
  1231. if err != nil {
  1232. return err
  1233. }
  1234. return Fstatfs(fd, stat)
  1235. }
  1236. var (
  1237. Stdin = 0
  1238. Stdout = 1
  1239. Stderr = 2
  1240. )
  1241. // Do the interface allocations only once for common
  1242. // Errno values.
  1243. var (
  1244. errEAGAIN error = syscall.EAGAIN
  1245. errEINVAL error = syscall.EINVAL
  1246. errENOENT error = syscall.ENOENT
  1247. )
  1248. var (
  1249. signalNameMapOnce sync.Once
  1250. signalNameMap map[string]syscall.Signal
  1251. )
  1252. // errnoErr returns common boxed Errno values, to prevent
  1253. // allocations at runtime.
  1254. func errnoErr(e Errno) error {
  1255. switch e {
  1256. case 0:
  1257. return nil
  1258. case EAGAIN:
  1259. return errEAGAIN
  1260. case EINVAL:
  1261. return errEINVAL
  1262. case ENOENT:
  1263. return errENOENT
  1264. }
  1265. return e
  1266. }
  1267. // ErrnoName returns the error name for error number e.
  1268. func ErrnoName(e Errno) string {
  1269. i := sort.Search(len(errorList), func(i int) bool {
  1270. return errorList[i].num >= e
  1271. })
  1272. if i < len(errorList) && errorList[i].num == e {
  1273. return errorList[i].name
  1274. }
  1275. return ""
  1276. }
  1277. // SignalName returns the signal name for signal number s.
  1278. func SignalName(s syscall.Signal) string {
  1279. i := sort.Search(len(signalList), func(i int) bool {
  1280. return signalList[i].num >= s
  1281. })
  1282. if i < len(signalList) && signalList[i].num == s {
  1283. return signalList[i].name
  1284. }
  1285. return ""
  1286. }
  1287. // SignalNum returns the syscall.Signal for signal named s,
  1288. // or 0 if a signal with such name is not found.
  1289. // The signal name should start with "SIG".
  1290. func SignalNum(s string) syscall.Signal {
  1291. signalNameMapOnce.Do(func() {
  1292. signalNameMap = make(map[string]syscall.Signal, len(signalList))
  1293. for _, signal := range signalList {
  1294. signalNameMap[signal.name] = signal.num
  1295. }
  1296. })
  1297. return signalNameMap[s]
  1298. }
  1299. // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
  1300. func clen(n []byte) int {
  1301. i := bytes.IndexByte(n, 0)
  1302. if i == -1 {
  1303. i = len(n)
  1304. }
  1305. return i
  1306. }
  1307. // Mmap manager, for use by operating system-specific implementations.
  1308. type mmapper struct {
  1309. sync.Mutex
  1310. active map[*byte][]byte // active mappings; key is last byte in mapping
  1311. mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
  1312. munmap func(addr uintptr, length uintptr) error
  1313. }
  1314. func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  1315. if length <= 0 {
  1316. return nil, EINVAL
  1317. }
  1318. // Map the requested memory.
  1319. addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
  1320. if errno != nil {
  1321. return nil, errno
  1322. }
  1323. // Slice memory layout
  1324. var sl = struct {
  1325. addr uintptr
  1326. len int
  1327. cap int
  1328. }{addr, length, length}
  1329. // Use unsafe to turn sl into a []byte.
  1330. b := *(*[]byte)(unsafe.Pointer(&sl))
  1331. // Register mapping in m and return it.
  1332. p := &b[cap(b)-1]
  1333. m.Lock()
  1334. defer m.Unlock()
  1335. m.active[p] = b
  1336. return b, nil
  1337. }
  1338. func (m *mmapper) Munmap(data []byte) (err error) {
  1339. if len(data) == 0 || len(data) != cap(data) {
  1340. return EINVAL
  1341. }
  1342. // Find the base of the mapping.
  1343. p := &data[cap(data)-1]
  1344. m.Lock()
  1345. defer m.Unlock()
  1346. b := m.active[p]
  1347. if b == nil || &b[0] != &data[0] {
  1348. return EINVAL
  1349. }
  1350. // Unmap the memory and update m.
  1351. if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
  1352. return errno
  1353. }
  1354. delete(m.active, p)
  1355. return nil
  1356. }
  1357. func Read(fd int, p []byte) (n int, err error) {
  1358. n, err = read(fd, p)
  1359. if raceenabled {
  1360. if n > 0 {
  1361. raceWriteRange(unsafe.Pointer(&p[0]), n)
  1362. }
  1363. if err == nil {
  1364. raceAcquire(unsafe.Pointer(&ioSync))
  1365. }
  1366. }
  1367. return
  1368. }
  1369. func Write(fd int, p []byte) (n int, err error) {
  1370. if raceenabled {
  1371. raceReleaseMerge(unsafe.Pointer(&ioSync))
  1372. }
  1373. n, err = write(fd, p)
  1374. if raceenabled && n > 0 {
  1375. raceReadRange(unsafe.Pointer(&p[0]), n)
  1376. }
  1377. return
  1378. }
  1379. // For testing: clients can set this flag to force
  1380. // creation of IPv6 sockets to return EAFNOSUPPORT.
  1381. var SocketDisableIPv6 bool
  1382. // Sockaddr represents a socket address.
  1383. type Sockaddr interface {
  1384. sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs
  1385. }
  1386. // SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets.
  1387. type SockaddrInet4 struct {
  1388. Port int
  1389. Addr [4]byte
  1390. raw RawSockaddrInet4
  1391. }
  1392. // SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets.
  1393. type SockaddrInet6 struct {
  1394. Port int
  1395. ZoneId uint32
  1396. Addr [16]byte
  1397. raw RawSockaddrInet6
  1398. }
  1399. // SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets.
  1400. type SockaddrUnix struct {
  1401. Name string
  1402. raw RawSockaddrUnix
  1403. }
  1404. func Bind(fd int, sa Sockaddr) (err error) {
  1405. ptr, n, err := sa.sockaddr()
  1406. if err != nil {
  1407. return err
  1408. }
  1409. return bind(fd, ptr, n)
  1410. }
  1411. func Connect(fd int, sa Sockaddr) (err error) {
  1412. ptr, n, err := sa.sockaddr()
  1413. if err != nil {
  1414. return err
  1415. }
  1416. return connect(fd, ptr, n)
  1417. }
  1418. func Getpeername(fd int) (sa Sockaddr, err error) {
  1419. var rsa RawSockaddrAny
  1420. var len _Socklen = SizeofSockaddrAny
  1421. if err = getpeername(fd, &rsa, &len); err != nil {
  1422. return
  1423. }
  1424. return anyToSockaddr(fd, &rsa)
  1425. }
  1426. func GetsockoptByte(fd, level, opt int) (value byte, err error) {
  1427. var n byte
  1428. vallen := _Socklen(1)
  1429. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  1430. return n, err
  1431. }
  1432. func GetsockoptInt(fd, level, opt int) (value int, err error) {
  1433. var n int32
  1434. vallen := _Socklen(4)
  1435. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  1436. return int(n), err
  1437. }
  1438. func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
  1439. vallen := _Socklen(4)
  1440. err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)
  1441. return value, err
  1442. }
  1443. func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
  1444. var value IPMreq
  1445. vallen := _Socklen(SizeofIPMreq)
  1446. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  1447. return &value, err
  1448. }
  1449. func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
  1450. var value IPv6Mreq
  1451. vallen := _Socklen(SizeofIPv6Mreq)
  1452. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  1453. return &value, err
  1454. }
  1455. func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
  1456. var value IPv6MTUInfo
  1457. vallen := _Socklen(SizeofIPv6MTUInfo)
  1458. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  1459. return &value, err
  1460. }
  1461. func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {
  1462. var value ICMPv6Filter
  1463. vallen := _Socklen(SizeofICMPv6Filter)
  1464. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  1465. return &value, err
  1466. }
  1467. func GetsockoptLinger(fd, level, opt int) (*Linger, error) {
  1468. var linger Linger
  1469. vallen := _Socklen(SizeofLinger)
  1470. err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen)
  1471. return &linger, err
  1472. }
  1473. func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) {
  1474. var tv Timeval
  1475. vallen := _Socklen(unsafe.Sizeof(tv))
  1476. err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen)
  1477. return &tv, err
  1478. }
  1479. func GetsockoptUint64(fd, level, opt int) (value uint64, err error) {
  1480. var n uint64
  1481. vallen := _Socklen(8)
  1482. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  1483. return n, err
  1484. }
  1485. func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
  1486. var rsa RawSockaddrAny
  1487. var len _Socklen = SizeofSockaddrAny
  1488. if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
  1489. return
  1490. }
  1491. if rsa.Addr.Family != AF_UNSPEC {
  1492. from, err = anyToSockaddr(fd, &rsa)
  1493. }
  1494. return
  1495. }
  1496. func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
  1497. ptr, n, err := to.sockaddr()
  1498. if err != nil {
  1499. return err
  1500. }
  1501. return sendto(fd, p, flags, ptr, n)
  1502. }
  1503. func SetsockoptByte(fd, level, opt int, value byte) (err error) {
  1504. return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)
  1505. }
  1506. func SetsockoptInt(fd, level, opt int, value int) (err error) {
  1507. var n = int32(value)
  1508. return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
  1509. }
  1510. func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
  1511. return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
  1512. }
  1513. func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
  1514. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)
  1515. }
  1516. func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
  1517. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)
  1518. }
  1519. func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
  1520. return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
  1521. }
  1522. func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
  1523. return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)
  1524. }
  1525. func SetsockoptString(fd, level, opt int, s string) (err error) {
  1526. var p unsafe.Pointer
  1527. if len(s) > 0 {
  1528. p = unsafe.Pointer(&[]byte(s)[0])
  1529. }
  1530. return setsockopt(fd, level, opt, p, uintptr(len(s)))
  1531. }
  1532. func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
  1533. return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))
  1534. }
  1535. func SetsockoptUint64(fd, level, opt int, value uint64) (err error) {
  1536. return setsockopt(fd, level, opt, unsafe.Pointer(&value), 8)
  1537. }
  1538. func Socket(domain, typ, proto int) (fd int, err error) {
  1539. if domain == AF_INET6 && SocketDisableIPv6 {
  1540. return -1, EAFNOSUPPORT
  1541. }
  1542. fd, err = socket(domain, typ, proto)
  1543. return
  1544. }
  1545. func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
  1546. var fdx [2]int32
  1547. err = socketpair(domain, typ, proto, &fdx)
  1548. if err == nil {
  1549. fd[0] = int(fdx[0])
  1550. fd[1] = int(fdx[1])
  1551. }
  1552. return
  1553. }
  1554. var ioSync int64
  1555. func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
  1556. func SetNonblock(fd int, nonblocking bool) (err error) {
  1557. flag, err := fcntl(fd, F_GETFL, 0)
  1558. if err != nil {
  1559. return err
  1560. }
  1561. if nonblocking {
  1562. flag |= O_NONBLOCK
  1563. } else {
  1564. flag &= ^O_NONBLOCK
  1565. }
  1566. _, err = fcntl(fd, F_SETFL, flag)
  1567. return err
  1568. }
  1569. // Exec calls execve(2), which replaces the calling executable in the process
  1570. // tree. argv0 should be the full path to an executable ("/bin/ls") and the
  1571. // executable name should also be the first argument in argv (["ls", "-l"]).
  1572. // envv are the environment variables that should be passed to the new
  1573. // process (["USER=go", "PWD=/tmp"]).
  1574. func Exec(argv0 string, argv []string, envv []string) error {
  1575. return syscall.Exec(argv0, argv, envv)
  1576. }
  1577. func Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
  1578. if needspace := 8 - len(fstype); needspace <= 0 {
  1579. fstype = fstype[:8]
  1580. } else {
  1581. fstype += " "[:needspace]
  1582. }
  1583. return mount_LE(target, source, fstype, uint32(flags), int32(len(data)), data)
  1584. }
  1585. func Unmount(name string, mtm int) (err error) {
  1586. // mountpoint is always a full path and starts with a '/'
  1587. // check if input string is not a mountpoint but a filesystem name
  1588. if name[0] != '/' {
  1589. return unmount(name, mtm)
  1590. }
  1591. // treat name as mountpoint
  1592. b2s := func(arr []byte) string {
  1593. nulli := bytes.IndexByte(arr, 0)
  1594. if nulli == -1 {
  1595. return string(arr)
  1596. } else {
  1597. return string(arr[:nulli])
  1598. }
  1599. }
  1600. var buffer struct {
  1601. header W_Mnth
  1602. fsinfo [64]W_Mntent
  1603. }
  1604. fsCount, err := W_Getmntent_A((*byte)(unsafe.Pointer(&buffer)), int(unsafe.Sizeof(buffer)))
  1605. if err != nil {
  1606. return err
  1607. }
  1608. if fsCount == 0 {
  1609. return EINVAL
  1610. }
  1611. for i := 0; i < fsCount; i++ {
  1612. if b2s(buffer.fsinfo[i].Mountpoint[:]) == name {
  1613. err = unmount(b2s(buffer.fsinfo[i].Fsname[:]), mtm)
  1614. break
  1615. }
  1616. }
  1617. return err
  1618. }