syscall_zos_s390x.go 53 KB

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