syscall_zos_s390x.go 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117
  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. // Many of the following syscalls are not available on all versions of z/OS.
  6. // Some missing calls have legacy implementations/simulations but others
  7. // will be missing completely. To achieve consistent failing behaviour on
  8. // legacy systems, we first test the function pointer via a safeloading
  9. // mechanism to see if the function exists on a given system. Then execution
  10. // is branched to either continue the function call, or return an error.
  11. package unix
  12. import (
  13. "bytes"
  14. "fmt"
  15. "os"
  16. "reflect"
  17. "regexp"
  18. "runtime"
  19. "sort"
  20. "strings"
  21. "sync"
  22. "syscall"
  23. "unsafe"
  24. )
  25. //go:noescape
  26. func initZosLibVec()
  27. //go:noescape
  28. func GetZosLibVec() uintptr
  29. func init() {
  30. initZosLibVec()
  31. r0, _, _ := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS_____GETENV_A<<4, uintptr(unsafe.Pointer(&([]byte("__ZOS_XSYSTRACE\x00"))[0])))
  32. if r0 != 0 {
  33. n, _, _ := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___ATOI_A<<4, r0)
  34. ZosTraceLevel = int(n)
  35. r0, _, _ := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS_____GETENV_A<<4, uintptr(unsafe.Pointer(&([]byte("__ZOS_XSYSTRACEFD\x00"))[0])))
  36. if r0 != 0 {
  37. fd, _, _ := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___ATOI_A<<4, r0)
  38. f := os.NewFile(fd, "zostracefile")
  39. if f != nil {
  40. ZosTracefile = f
  41. }
  42. }
  43. }
  44. }
  45. //go:noescape
  46. func CallLeFuncWithErr(funcdesc uintptr, parms ...uintptr) (ret, errno2 uintptr, err Errno)
  47. //go:noescape
  48. func CallLeFuncWithPtrReturn(funcdesc uintptr, parms ...uintptr) (ret, errno2 uintptr, err Errno)
  49. // -------------------------------
  50. // pointer validity test
  51. // good pointer returns 0
  52. // bad pointer returns 1
  53. //
  54. //go:nosplit
  55. func ptrtest(uintptr) uint64
  56. // Load memory at ptr location with error handling if the location is invalid
  57. //
  58. //go:noescape
  59. func safeload(ptr uintptr) (value uintptr, error uintptr)
  60. const (
  61. entrypointLocationOffset = 8 // From function descriptor
  62. xplinkEyecatcher = 0x00c300c500c500f1 // ".C.E.E.1"
  63. eyecatcherOffset = 16 // From function entrypoint (negative)
  64. ppa1LocationOffset = 8 // From function entrypoint (negative)
  65. nameLenOffset = 0x14 // From PPA1 start
  66. nameOffset = 0x16 // From PPA1 start
  67. )
  68. func getPpaOffset(funcptr uintptr) int64 {
  69. entrypoint, err := safeload(funcptr + entrypointLocationOffset)
  70. if err != 0 {
  71. return -1
  72. }
  73. // XPLink functions have ".C.E.E.1" as the first 8 bytes (EBCDIC)
  74. val, err := safeload(entrypoint - eyecatcherOffset)
  75. if err != 0 {
  76. return -1
  77. }
  78. if val != xplinkEyecatcher {
  79. return -1
  80. }
  81. ppaoff, err := safeload(entrypoint - ppa1LocationOffset)
  82. if err != 0 {
  83. return -1
  84. }
  85. ppaoff >>= 32
  86. return int64(ppaoff)
  87. }
  88. //-------------------------------
  89. // function descriptor pointer validity test
  90. // good pointer returns 0
  91. // bad pointer returns 1
  92. // TODO: currently mksyscall_zos_s390x.go generate empty string for funcName
  93. // have correct funcName pass to the funcptrtest function
  94. func funcptrtest(funcptr uintptr, funcName string) uint64 {
  95. entrypoint, err := safeload(funcptr + entrypointLocationOffset)
  96. if err != 0 {
  97. return 1
  98. }
  99. ppaoff := getPpaOffset(funcptr)
  100. if ppaoff == -1 {
  101. return 1
  102. }
  103. // PPA1 offset value is from the start of the entire function block, not the entrypoint
  104. ppa1 := (entrypoint - eyecatcherOffset) + uintptr(ppaoff)
  105. nameLen, err := safeload(ppa1 + nameLenOffset)
  106. if err != 0 {
  107. return 1
  108. }
  109. nameLen >>= 48
  110. if nameLen > 128 {
  111. return 1
  112. }
  113. // no function name input to argument end here
  114. if funcName == "" {
  115. return 0
  116. }
  117. var funcname [128]byte
  118. for i := 0; i < int(nameLen); i += 8 {
  119. v, err := safeload(ppa1 + nameOffset + uintptr(i))
  120. if err != 0 {
  121. return 1
  122. }
  123. funcname[i] = byte(v >> 56)
  124. funcname[i+1] = byte(v >> 48)
  125. funcname[i+2] = byte(v >> 40)
  126. funcname[i+3] = byte(v >> 32)
  127. funcname[i+4] = byte(v >> 24)
  128. funcname[i+5] = byte(v >> 16)
  129. funcname[i+6] = byte(v >> 8)
  130. funcname[i+7] = byte(v)
  131. }
  132. runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___E2A_L<<4, // __e2a_l
  133. []uintptr{uintptr(unsafe.Pointer(&funcname[0])), nameLen})
  134. name := string(funcname[:nameLen])
  135. if name != funcName {
  136. return 1
  137. }
  138. return 0
  139. }
  140. // For detection of capabilities on a system.
  141. // Is function descriptor f a valid function?
  142. func isValidLeFunc(f uintptr) error {
  143. ret := funcptrtest(f, "")
  144. if ret != 0 {
  145. return fmt.Errorf("Bad pointer, not an LE function ")
  146. }
  147. return nil
  148. }
  149. // Retrieve function name from descriptor
  150. func getLeFuncName(f uintptr) (string, error) {
  151. // assume it has been checked, only check ppa1 validity here
  152. entry := ((*[2]uintptr)(unsafe.Pointer(f)))[1]
  153. preamp := ((*[4]uint32)(unsafe.Pointer(entry - eyecatcherOffset)))
  154. offsetPpa1 := preamp[2]
  155. if offsetPpa1 > 0x0ffff {
  156. return "", fmt.Errorf("PPA1 offset seems too big 0x%x\n", offsetPpa1)
  157. }
  158. ppa1 := uintptr(unsafe.Pointer(preamp)) + uintptr(offsetPpa1)
  159. res := ptrtest(ppa1)
  160. if res != 0 {
  161. return "", fmt.Errorf("PPA1 address not valid")
  162. }
  163. size := *(*uint16)(unsafe.Pointer(ppa1 + nameLenOffset))
  164. if size > 128 {
  165. return "", fmt.Errorf("Function name seems too long, length=%d\n", size)
  166. }
  167. var name [128]byte
  168. funcname := (*[128]byte)(unsafe.Pointer(ppa1 + nameOffset))
  169. copy(name[0:size], funcname[0:size])
  170. runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___E2A_L<<4, // __e2a_l
  171. []uintptr{uintptr(unsafe.Pointer(&name[0])), uintptr(size)})
  172. return string(name[:size]), nil
  173. }
  174. // Check z/OS version
  175. func zosLeVersion() (version, release uint32) {
  176. p1 := (*(*uintptr)(unsafe.Pointer(uintptr(1208)))) >> 32
  177. p1 = *(*uintptr)(unsafe.Pointer(uintptr(p1 + 88)))
  178. p1 = *(*uintptr)(unsafe.Pointer(uintptr(p1 + 8)))
  179. p1 = *(*uintptr)(unsafe.Pointer(uintptr(p1 + 984)))
  180. vrm := *(*uint32)(unsafe.Pointer(p1 + 80))
  181. version = (vrm & 0x00ff0000) >> 16
  182. release = (vrm & 0x0000ff00) >> 8
  183. return
  184. }
  185. // returns a zos C FILE * for stdio fd 0, 1, 2
  186. func ZosStdioFilep(fd int32) uintptr {
  187. return uintptr(*(*uint64)(unsafe.Pointer(uintptr(*(*uint64)(unsafe.Pointer(uintptr(*(*uint64)(unsafe.Pointer(uintptr(uint64(*(*uint32)(unsafe.Pointer(uintptr(1208)))) + 80))) + uint64((fd+2)<<3))))))))
  188. }
  189. func copyStat(stat *Stat_t, statLE *Stat_LE_t) {
  190. stat.Dev = uint64(statLE.Dev)
  191. stat.Ino = uint64(statLE.Ino)
  192. stat.Nlink = uint64(statLE.Nlink)
  193. stat.Mode = uint32(statLE.Mode)
  194. stat.Uid = uint32(statLE.Uid)
  195. stat.Gid = uint32(statLE.Gid)
  196. stat.Rdev = uint64(statLE.Rdev)
  197. stat.Size = statLE.Size
  198. stat.Atim.Sec = int64(statLE.Atim)
  199. stat.Atim.Nsec = 0 //zos doesn't return nanoseconds
  200. stat.Mtim.Sec = int64(statLE.Mtim)
  201. stat.Mtim.Nsec = 0 //zos doesn't return nanoseconds
  202. stat.Ctim.Sec = int64(statLE.Ctim)
  203. stat.Ctim.Nsec = 0 //zos doesn't return nanoseconds
  204. stat.Blksize = int64(statLE.Blksize)
  205. stat.Blocks = statLE.Blocks
  206. }
  207. func svcCall(fnptr unsafe.Pointer, argv *unsafe.Pointer, dsa *uint64)
  208. func svcLoad(name *byte) unsafe.Pointer
  209. func svcUnload(name *byte, fnptr unsafe.Pointer) int64
  210. func (d *Dirent) NameString() string {
  211. if d == nil {
  212. return ""
  213. }
  214. s := string(d.Name[:])
  215. idx := strings.IndexByte(s, 0)
  216. if idx == -1 {
  217. return s
  218. } else {
  219. return s[:idx]
  220. }
  221. }
  222. func DecodeData(dest []byte, sz int, val uint64) {
  223. for i := 0; i < sz; i++ {
  224. dest[sz-1-i] = byte((val >> (uint64(i * 8))) & 0xff)
  225. }
  226. }
  227. func EncodeData(data []byte) uint64 {
  228. var value uint64
  229. sz := len(data)
  230. for i := 0; i < sz; i++ {
  231. value |= uint64(data[i]) << uint64(((sz - i - 1) * 8))
  232. }
  233. return value
  234. }
  235. func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, _Socklen, error) {
  236. if sa.Port < 0 || sa.Port > 0xFFFF {
  237. return nil, 0, EINVAL
  238. }
  239. sa.raw.Len = SizeofSockaddrInet4
  240. sa.raw.Family = AF_INET
  241. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  242. p[0] = byte(sa.Port >> 8)
  243. p[1] = byte(sa.Port)
  244. for i := 0; i < len(sa.Addr); i++ {
  245. sa.raw.Addr[i] = sa.Addr[i]
  246. }
  247. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  248. }
  249. func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, _Socklen, error) {
  250. if sa.Port < 0 || sa.Port > 0xFFFF {
  251. return nil, 0, EINVAL
  252. }
  253. sa.raw.Len = SizeofSockaddrInet6
  254. sa.raw.Family = AF_INET6
  255. p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
  256. p[0] = byte(sa.Port >> 8)
  257. p[1] = byte(sa.Port)
  258. sa.raw.Scope_id = sa.ZoneId
  259. for i := 0; i < len(sa.Addr); i++ {
  260. sa.raw.Addr[i] = sa.Addr[i]
  261. }
  262. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  263. }
  264. func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, _Socklen, error) {
  265. name := sa.Name
  266. n := len(name)
  267. if n >= len(sa.raw.Path) || n == 0 {
  268. return nil, 0, EINVAL
  269. }
  270. sa.raw.Len = byte(3 + n) // 2 for Family, Len; 1 for NUL
  271. sa.raw.Family = AF_UNIX
  272. for i := 0; i < n; i++ {
  273. sa.raw.Path[i] = int8(name[i])
  274. }
  275. return unsafe.Pointer(&sa.raw), _Socklen(sa.raw.Len), nil
  276. }
  277. func anyToSockaddr(_ int, rsa *RawSockaddrAny) (Sockaddr, error) {
  278. // TODO(neeilan): Implement use of first param (fd)
  279. switch rsa.Addr.Family {
  280. case AF_UNIX:
  281. pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
  282. sa := new(SockaddrUnix)
  283. // For z/OS, only replace NUL with @ when the
  284. // length is not zero.
  285. if pp.Len != 0 && pp.Path[0] == 0 {
  286. // "Abstract" Unix domain socket.
  287. // Rewrite leading NUL as @ for textual display.
  288. // (This is the standard convention.)
  289. // Not friendly to overwrite in place,
  290. // but the callers below don't care.
  291. pp.Path[0] = '@'
  292. }
  293. // Assume path ends at NUL.
  294. //
  295. // For z/OS, the length of the name is a field
  296. // in the structure. To be on the safe side, we
  297. // will still scan the name for a NUL but only
  298. // to the length provided in the structure.
  299. //
  300. // This is not technically the Linux semantics for
  301. // abstract Unix domain sockets--they are supposed
  302. // to be uninterpreted fixed-size binary blobs--but
  303. // everyone uses this convention.
  304. n := 0
  305. for n < int(pp.Len) && pp.Path[n] != 0 {
  306. n++
  307. }
  308. sa.Name = string(unsafe.Slice((*byte)(unsafe.Pointer(&pp.Path[0])), n))
  309. return sa, nil
  310. case AF_INET:
  311. pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
  312. sa := new(SockaddrInet4)
  313. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  314. sa.Port = int(p[0])<<8 + int(p[1])
  315. for i := 0; i < len(sa.Addr); i++ {
  316. sa.Addr[i] = pp.Addr[i]
  317. }
  318. return sa, nil
  319. case AF_INET6:
  320. pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
  321. sa := new(SockaddrInet6)
  322. p := (*[2]byte)(unsafe.Pointer(&pp.Port))
  323. sa.Port = int(p[0])<<8 + int(p[1])
  324. sa.ZoneId = pp.Scope_id
  325. for i := 0; i < len(sa.Addr); i++ {
  326. sa.Addr[i] = pp.Addr[i]
  327. }
  328. return sa, nil
  329. }
  330. return nil, EAFNOSUPPORT
  331. }
  332. func Accept(fd int) (nfd int, sa Sockaddr, err error) {
  333. var rsa RawSockaddrAny
  334. var len _Socklen = SizeofSockaddrAny
  335. nfd, err = accept(fd, &rsa, &len)
  336. if err != nil {
  337. return
  338. }
  339. // TODO(neeilan): Remove 0 in call
  340. sa, err = anyToSockaddr(0, &rsa)
  341. if err != nil {
  342. Close(nfd)
  343. nfd = 0
  344. }
  345. return
  346. }
  347. func Accept4(fd int, flags int) (nfd int, sa Sockaddr, err error) {
  348. var rsa RawSockaddrAny
  349. var len _Socklen = SizeofSockaddrAny
  350. nfd, err = accept4(fd, &rsa, &len, flags)
  351. if err != nil {
  352. return
  353. }
  354. if len > SizeofSockaddrAny {
  355. panic("RawSockaddrAny too small")
  356. }
  357. // TODO(neeilan): Remove 0 in call
  358. sa, err = anyToSockaddr(0, &rsa)
  359. if err != nil {
  360. Close(nfd)
  361. nfd = 0
  362. }
  363. return
  364. }
  365. func Ctermid() (tty string, err error) {
  366. var termdev [1025]byte
  367. runtime.EnterSyscall()
  368. r0, err2, err1 := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___CTERMID_A<<4, uintptr(unsafe.Pointer(&termdev[0])))
  369. runtime.ExitSyscall()
  370. if r0 == 0 {
  371. return "", fmt.Errorf("%s (errno2=0x%x)\n", err1.Error(), err2)
  372. }
  373. s := string(termdev[:])
  374. idx := strings.Index(s, string(rune(0)))
  375. if idx == -1 {
  376. tty = s
  377. } else {
  378. tty = s[:idx]
  379. }
  380. return
  381. }
  382. func (iov *Iovec) SetLen(length int) {
  383. iov.Len = uint64(length)
  384. }
  385. func (msghdr *Msghdr) SetControllen(length int) {
  386. msghdr.Controllen = int32(length)
  387. }
  388. func (cmsg *Cmsghdr) SetLen(length int) {
  389. cmsg.Len = int32(length)
  390. }
  391. //sys fcntl(fd int, cmd int, arg int) (val int, err error)
  392. //sys Flistxattr(fd int, dest []byte) (sz int, err error) = SYS___FLISTXATTR_A
  393. //sys Fremovexattr(fd int, attr string) (err error) = SYS___FREMOVEXATTR_A
  394. //sys read(fd int, p []byte) (n int, err error)
  395. //sys write(fd int, p []byte) (n int, err error)
  396. //sys Fgetxattr(fd int, attr string, dest []byte) (sz int, err error) = SYS___FGETXATTR_A
  397. //sys Fsetxattr(fd int, attr string, data []byte, flag int) (err error) = SYS___FSETXATTR_A
  398. //sys accept(s int, rsa *RawSockaddrAny, addrlen *_Socklen) (fd int, err error) = SYS___ACCEPT_A
  399. //sys accept4(s int, rsa *RawSockaddrAny, addrlen *_Socklen, flags int) (fd int, err error) = SYS___ACCEPT4_A
  400. //sys bind(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___BIND_A
  401. //sys connect(s int, addr unsafe.Pointer, addrlen _Socklen) (err error) = SYS___CONNECT_A
  402. //sysnb getgroups(n int, list *_Gid_t) (nn int, err error)
  403. //sysnb setgroups(n int, list *_Gid_t) (err error)
  404. //sys getsockopt(s int, level int, name int, val unsafe.Pointer, vallen *_Socklen) (err error)
  405. //sys setsockopt(s int, level int, name int, val unsafe.Pointer, vallen uintptr) (err error)
  406. //sysnb socket(domain int, typ int, proto int) (fd int, err error)
  407. //sysnb socketpair(domain int, typ int, proto int, fd *[2]int32) (err error)
  408. //sysnb getpeername(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETPEERNAME_A
  409. //sysnb getsockname(fd int, rsa *RawSockaddrAny, addrlen *_Socklen) (err error) = SYS___GETSOCKNAME_A
  410. //sys Removexattr(path string, attr string) (err error) = SYS___REMOVEXATTR_A
  411. //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) = SYS___RECVFROM_A
  412. //sys sendto(s int, buf []byte, flags int, to unsafe.Pointer, addrlen _Socklen) (err error) = SYS___SENDTO_A
  413. //sys recvmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___RECVMSG_A
  414. //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = SYS___SENDMSG_A
  415. //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) = SYS_MMAP
  416. //sys munmap(addr uintptr, length uintptr) (err error) = SYS_MUNMAP
  417. //sys ioctl(fd int, req int, arg uintptr) (err error) = SYS_IOCTL
  418. //sys ioctlPtr(fd int, req int, arg unsafe.Pointer) (err error) = SYS_IOCTL
  419. //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) = SYS_SHMAT
  420. //sys shmctl(id int, cmd int, buf *SysvShmDesc) (result int, err error) = SYS_SHMCTL64
  421. //sys shmdt(addr uintptr) (err error) = SYS_SHMDT
  422. //sys shmget(key int, size int, flag int) (id int, err error) = SYS_SHMGET
  423. //sys Access(path string, mode uint32) (err error) = SYS___ACCESS_A
  424. //sys Chdir(path string) (err error) = SYS___CHDIR_A
  425. //sys Chown(path string, uid int, gid int) (err error) = SYS___CHOWN_A
  426. //sys Chmod(path string, mode uint32) (err error) = SYS___CHMOD_A
  427. //sys Creat(path string, mode uint32) (fd int, err error) = SYS___CREAT_A
  428. //sys Dup(oldfd int) (fd int, err error)
  429. //sys Dup2(oldfd int, newfd int) (err error)
  430. //sys Dup3(oldfd int, newfd int, flags int) (err error) = SYS_DUP3
  431. //sys Dirfd(dirp uintptr) (fd int, err error) = SYS_DIRFD
  432. //sys EpollCreate(size int) (fd int, err error) = SYS_EPOLL_CREATE
  433. //sys EpollCreate1(flags int) (fd int, err error) = SYS_EPOLL_CREATE1
  434. //sys EpollCtl(epfd int, op int, fd int, event *EpollEvent) (err error) = SYS_EPOLL_CTL
  435. //sys EpollPwait(epfd int, events []EpollEvent, msec int, sigmask *int) (n int, err error) = SYS_EPOLL_PWAIT
  436. //sys EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_WAIT
  437. //sys Errno2() (er2 int) = SYS___ERRNO2
  438. //sys Eventfd(initval uint, flags int) (fd int, err error) = SYS_EVENTFD
  439. //sys Exit(code int)
  440. //sys Faccessat(dirfd int, path string, mode uint32, flags int) (err error) = SYS___FACCESSAT_A
  441. func Faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
  442. return Faccessat(dirfd, path, mode, flags)
  443. }
  444. //sys Fchdir(fd int) (err error)
  445. //sys Fchmod(fd int, mode uint32) (err error)
  446. //sys Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) = SYS___FCHMODAT_A
  447. //sys Fchown(fd int, uid int, gid int) (err error)
  448. //sys Fchownat(fd int, path string, uid int, gid int, flags int) (err error) = SYS___FCHOWNAT_A
  449. //sys FcntlInt(fd uintptr, cmd int, arg int) (retval int, err error) = SYS_FCNTL
  450. //sys Fdatasync(fd int) (err error) = SYS_FDATASYNC
  451. //sys fstat(fd int, stat *Stat_LE_t) (err error)
  452. //sys fstatat(dirfd int, path string, stat *Stat_LE_t, flags int) (err error) = SYS___FSTATAT_A
  453. func Fstat(fd int, stat *Stat_t) (err error) {
  454. var statLE Stat_LE_t
  455. err = fstat(fd, &statLE)
  456. copyStat(stat, &statLE)
  457. return
  458. }
  459. func Fstatat(dirfd int, path string, stat *Stat_t, flags int) (err error) {
  460. var statLE Stat_LE_t
  461. err = fstatat(dirfd, path, &statLE, flags)
  462. copyStat(stat, &statLE)
  463. return
  464. }
  465. func impl_Getxattr(path string, attr string, dest []byte) (sz int, err error) {
  466. var _p0 *byte
  467. _p0, err = BytePtrFromString(path)
  468. if err != nil {
  469. return
  470. }
  471. var _p1 *byte
  472. _p1, err = BytePtrFromString(attr)
  473. if err != nil {
  474. return
  475. }
  476. var _p2 unsafe.Pointer
  477. if len(dest) > 0 {
  478. _p2 = unsafe.Pointer(&dest[0])
  479. } else {
  480. _p2 = unsafe.Pointer(&_zero)
  481. }
  482. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___GETXATTR_A<<4, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(dest)))
  483. sz = int(r0)
  484. if int64(r0) == -1 {
  485. err = errnoErr2(e1, e2)
  486. }
  487. return
  488. }
  489. //go:nosplit
  490. func get_GetxattrAddr() *(func(path string, attr string, dest []byte) (sz int, err error))
  491. var Getxattr = enter_Getxattr
  492. func enter_Getxattr(path string, attr string, dest []byte) (sz int, err error) {
  493. funcref := get_GetxattrAddr()
  494. if validGetxattr() {
  495. *funcref = impl_Getxattr
  496. } else {
  497. *funcref = error_Getxattr
  498. }
  499. return (*funcref)(path, attr, dest)
  500. }
  501. func error_Getxattr(path string, attr string, dest []byte) (sz int, err error) {
  502. return -1, ENOSYS
  503. }
  504. func validGetxattr() bool {
  505. if funcptrtest(GetZosLibVec()+SYS___GETXATTR_A<<4, "") == 0 {
  506. if name, err := getLeFuncName(GetZosLibVec() + SYS___GETXATTR_A<<4); err == nil {
  507. return name == "__getxattr_a"
  508. }
  509. }
  510. return false
  511. }
  512. //sys Lgetxattr(link string, attr string, dest []byte) (sz int, err error) = SYS___LGETXATTR_A
  513. //sys Lsetxattr(path string, attr string, data []byte, flags int) (err error) = SYS___LSETXATTR_A
  514. func impl_Setxattr(path string, attr string, data []byte, flags int) (err error) {
  515. var _p0 *byte
  516. _p0, err = BytePtrFromString(path)
  517. if err != nil {
  518. return
  519. }
  520. var _p1 *byte
  521. _p1, err = BytePtrFromString(attr)
  522. if err != nil {
  523. return
  524. }
  525. var _p2 unsafe.Pointer
  526. if len(data) > 0 {
  527. _p2 = unsafe.Pointer(&data[0])
  528. } else {
  529. _p2 = unsafe.Pointer(&_zero)
  530. }
  531. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___SETXATTR_A<<4, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(_p2), uintptr(len(data)), uintptr(flags))
  532. if int64(r0) == -1 {
  533. err = errnoErr2(e1, e2)
  534. }
  535. return
  536. }
  537. //go:nosplit
  538. func get_SetxattrAddr() *(func(path string, attr string, data []byte, flags int) (err error))
  539. var Setxattr = enter_Setxattr
  540. func enter_Setxattr(path string, attr string, data []byte, flags int) (err error) {
  541. funcref := get_SetxattrAddr()
  542. if validSetxattr() {
  543. *funcref = impl_Setxattr
  544. } else {
  545. *funcref = error_Setxattr
  546. }
  547. return (*funcref)(path, attr, data, flags)
  548. }
  549. func error_Setxattr(path string, attr string, data []byte, flags int) (err error) {
  550. return ENOSYS
  551. }
  552. func validSetxattr() bool {
  553. if funcptrtest(GetZosLibVec()+SYS___SETXATTR_A<<4, "") == 0 {
  554. if name, err := getLeFuncName(GetZosLibVec() + SYS___SETXATTR_A<<4); err == nil {
  555. return name == "__setxattr_a"
  556. }
  557. }
  558. return false
  559. }
  560. //sys Fstatfs(fd int, buf *Statfs_t) (err error) = SYS_FSTATFS
  561. //sys Fstatvfs(fd int, stat *Statvfs_t) (err error) = SYS_FSTATVFS
  562. //sys Fsync(fd int) (err error)
  563. //sys Futimes(fd int, tv []Timeval) (err error) = SYS_FUTIMES
  564. //sys Futimesat(dirfd int, path string, tv []Timeval) (err error) = SYS___FUTIMESAT_A
  565. //sys Ftruncate(fd int, length int64) (err error)
  566. //sys Getrandom(buf []byte, flags int) (n int, err error) = SYS_GETRANDOM
  567. //sys InotifyInit() (fd int, err error) = SYS_INOTIFY_INIT
  568. //sys InotifyInit1(flags int) (fd int, err error) = SYS_INOTIFY_INIT1
  569. //sys InotifyAddWatch(fd int, pathname string, mask uint32) (watchdesc int, err error) = SYS___INOTIFY_ADD_WATCH_A
  570. //sys InotifyRmWatch(fd int, watchdesc uint32) (success int, err error) = SYS_INOTIFY_RM_WATCH
  571. //sys Listxattr(path string, dest []byte) (sz int, err error) = SYS___LISTXATTR_A
  572. //sys Llistxattr(path string, dest []byte) (sz int, err error) = SYS___LLISTXATTR_A
  573. //sys Lremovexattr(path string, attr string) (err error) = SYS___LREMOVEXATTR_A
  574. //sys Lutimes(path string, tv []Timeval) (err error) = SYS___LUTIMES_A
  575. //sys Mprotect(b []byte, prot int) (err error) = SYS_MPROTECT
  576. //sys Msync(b []byte, flags int) (err error) = SYS_MSYNC
  577. //sys Console2(cmsg *ConsMsg2, modstr *byte, concmd *uint32) (err error) = SYS___CONSOLE2
  578. // Pipe2 begin
  579. //go:nosplit
  580. func getPipe2Addr() *(func([]int, int) error)
  581. var Pipe2 = pipe2Enter
  582. func pipe2Enter(p []int, flags int) (err error) {
  583. if funcptrtest(GetZosLibVec()+SYS_PIPE2<<4, "") == 0 {
  584. *getPipe2Addr() = pipe2Impl
  585. } else {
  586. *getPipe2Addr() = pipe2Error
  587. }
  588. return (*getPipe2Addr())(p, flags)
  589. }
  590. func pipe2Impl(p []int, flags int) (err error) {
  591. var pp [2]_C_int
  592. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_PIPE2<<4, uintptr(unsafe.Pointer(&pp[0])), uintptr(flags))
  593. if int64(r0) == -1 {
  594. err = errnoErr2(e1, e2)
  595. } else {
  596. p[0] = int(pp[0])
  597. p[1] = int(pp[1])
  598. }
  599. return
  600. }
  601. func pipe2Error(p []int, flags int) (err error) {
  602. return fmt.Errorf("Pipe2 is not available on this system")
  603. }
  604. // Pipe2 end
  605. //sys Poll(fds []PollFd, timeout int) (n int, err error) = SYS_POLL
  606. func Readdir(dir uintptr) (dirent *Dirent, err error) {
  607. runtime.EnterSyscall()
  608. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___READDIR_A<<4, uintptr(dir))
  609. runtime.ExitSyscall()
  610. dirent = (*Dirent)(unsafe.Pointer(r0))
  611. if int64(r0) == -1 {
  612. err = errnoErr2(e1, e2)
  613. }
  614. return
  615. }
  616. //sys Readdir_r(dirp uintptr, entry *direntLE, result **direntLE) (err error) = SYS___READDIR_R_A
  617. //sys Statfs(path string, buf *Statfs_t) (err error) = SYS___STATFS_A
  618. //sys Syncfs(fd int) (err error) = SYS_SYNCFS
  619. //sys Times(tms *Tms) (ticks uintptr, err error) = SYS_TIMES
  620. //sys W_Getmntent(buff *byte, size int) (lastsys int, err error) = SYS_W_GETMNTENT
  621. //sys W_Getmntent_A(buff *byte, size int) (lastsys int, err error) = SYS___W_GETMNTENT_A
  622. //sys mount_LE(path string, filesystem string, fstype string, mtm uint32, parmlen int32, parm string) (err error) = SYS___MOUNT_A
  623. //sys unmount_LE(filesystem string, mtm int) (err error) = SYS___UMOUNT_A
  624. //sys Chroot(path string) (err error) = SYS___CHROOT_A
  625. //sys Select(nmsgsfds int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (ret int, err error) = SYS_SELECT
  626. //sysnb Uname(buf *Utsname) (err error) = SYS_____OSNAME_A
  627. //sys Unshare(flags int) (err error) = SYS_UNSHARE
  628. func Ptsname(fd int) (name string, err error) {
  629. runtime.EnterSyscall()
  630. r0, e2, e1 := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___PTSNAME_A<<4, uintptr(fd))
  631. runtime.ExitSyscall()
  632. if r0 == 0 {
  633. err = errnoErr2(e1, e2)
  634. } else {
  635. name = u2s(unsafe.Pointer(r0))
  636. }
  637. return
  638. }
  639. func u2s(cstr unsafe.Pointer) string {
  640. str := (*[1024]uint8)(cstr)
  641. i := 0
  642. for str[i] != 0 {
  643. i++
  644. }
  645. return string(str[:i])
  646. }
  647. func Close(fd int) (err error) {
  648. runtime.EnterSyscall()
  649. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_CLOSE<<4, uintptr(fd))
  650. runtime.ExitSyscall()
  651. for i := 0; e1 == EAGAIN && i < 10; i++ {
  652. runtime.EnterSyscall()
  653. CallLeFuncWithErr(GetZosLibVec()+SYS_USLEEP<<4, uintptr(10))
  654. runtime.ExitSyscall()
  655. runtime.EnterSyscall()
  656. r0, e2, e1 = CallLeFuncWithErr(GetZosLibVec()+SYS_CLOSE<<4, uintptr(fd))
  657. runtime.ExitSyscall()
  658. }
  659. if r0 != 0 {
  660. err = errnoErr2(e1, e2)
  661. }
  662. return
  663. }
  664. // Dummy function: there are no semantics for Madvise on z/OS
  665. func Madvise(b []byte, advice int) (err error) {
  666. return
  667. }
  668. func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  669. return mapper.Mmap(fd, offset, length, prot, flags)
  670. }
  671. func Munmap(b []byte) (err error) {
  672. return mapper.Munmap(b)
  673. }
  674. //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A
  675. //sysnb Getgid() (gid int)
  676. //sysnb Getpid() (pid int)
  677. //sysnb Getpgid(pid int) (pgid int, err error) = SYS_GETPGID
  678. func Getpgrp() (pid int) {
  679. pid, _ = Getpgid(0)
  680. return
  681. }
  682. //sysnb Getppid() (pid int)
  683. //sys Getpriority(which int, who int) (prio int, err error)
  684. //sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = SYS_GETRLIMIT
  685. //sysnb getrusage(who int, rusage *rusage_zos) (err error) = SYS_GETRUSAGE
  686. func Getrusage(who int, rusage *Rusage) (err error) {
  687. var ruz rusage_zos
  688. err = getrusage(who, &ruz)
  689. //Only the first two fields of Rusage are set
  690. rusage.Utime.Sec = ruz.Utime.Sec
  691. rusage.Utime.Usec = int64(ruz.Utime.Usec)
  692. rusage.Stime.Sec = ruz.Stime.Sec
  693. rusage.Stime.Usec = int64(ruz.Stime.Usec)
  694. return
  695. }
  696. //sys Getegid() (egid int) = SYS_GETEGID
  697. //sys Geteuid() (euid int) = SYS_GETEUID
  698. //sysnb Getsid(pid int) (sid int, err error) = SYS_GETSID
  699. //sysnb Getuid() (uid int)
  700. //sysnb Kill(pid int, sig Signal) (err error)
  701. //sys Lchown(path string, uid int, gid int) (err error) = SYS___LCHOWN_A
  702. //sys Link(path string, link string) (err error) = SYS___LINK_A
  703. //sys Linkat(oldDirFd int, oldPath string, newDirFd int, newPath string, flags int) (err error) = SYS___LINKAT_A
  704. //sys Listen(s int, n int) (err error)
  705. //sys lstat(path string, stat *Stat_LE_t) (err error) = SYS___LSTAT_A
  706. func Lstat(path string, stat *Stat_t) (err error) {
  707. var statLE Stat_LE_t
  708. err = lstat(path, &statLE)
  709. copyStat(stat, &statLE)
  710. return
  711. }
  712. // for checking symlinks begins with $VERSION/ $SYSNAME/ $SYSSYMR/ $SYSSYMA/
  713. func isSpecialPath(path []byte) (v bool) {
  714. var special = [4][8]byte{
  715. [8]byte{'V', 'E', 'R', 'S', 'I', 'O', 'N', '/'},
  716. [8]byte{'S', 'Y', 'S', 'N', 'A', 'M', 'E', '/'},
  717. [8]byte{'S', 'Y', 'S', 'S', 'Y', 'M', 'R', '/'},
  718. [8]byte{'S', 'Y', 'S', 'S', 'Y', 'M', 'A', '/'}}
  719. var i, j int
  720. for i = 0; i < len(special); i++ {
  721. for j = 0; j < len(special[i]); j++ {
  722. if path[j] != special[i][j] {
  723. break
  724. }
  725. }
  726. if j == len(special[i]) {
  727. return true
  728. }
  729. }
  730. return false
  731. }
  732. func realpath(srcpath string, abspath []byte) (pathlen int, errno int) {
  733. var source [1024]byte
  734. copy(source[:], srcpath)
  735. source[len(srcpath)] = 0
  736. ret := runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___REALPATH_A<<4, //__realpath_a()
  737. []uintptr{uintptr(unsafe.Pointer(&source[0])),
  738. uintptr(unsafe.Pointer(&abspath[0]))})
  739. if ret != 0 {
  740. index := bytes.IndexByte(abspath[:], byte(0))
  741. if index != -1 {
  742. return index, 0
  743. }
  744. } else {
  745. errptr := (*int)(unsafe.Pointer(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO<<4, []uintptr{}))) //__errno()
  746. return 0, *errptr
  747. }
  748. return 0, 245 // EBADDATA 245
  749. }
  750. func Readlink(path string, buf []byte) (n int, err error) {
  751. var _p0 *byte
  752. _p0, err = BytePtrFromString(path)
  753. if err != nil {
  754. return
  755. }
  756. var _p1 unsafe.Pointer
  757. if len(buf) > 0 {
  758. _p1 = unsafe.Pointer(&buf[0])
  759. } else {
  760. _p1 = unsafe.Pointer(&_zero)
  761. }
  762. n = int(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___READLINK_A<<4,
  763. []uintptr{uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf))}))
  764. runtime.KeepAlive(unsafe.Pointer(_p0))
  765. if n == -1 {
  766. value := *(*int32)(unsafe.Pointer(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO<<4, []uintptr{})))
  767. err = errnoErr(Errno(value))
  768. } else {
  769. if buf[0] == '$' {
  770. if isSpecialPath(buf[1:9]) {
  771. cnt, err1 := realpath(path, buf)
  772. if err1 == 0 {
  773. n = cnt
  774. }
  775. }
  776. }
  777. }
  778. return
  779. }
  780. func impl_Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
  781. var _p0 *byte
  782. _p0, err = BytePtrFromString(path)
  783. if err != nil {
  784. return
  785. }
  786. var _p1 unsafe.Pointer
  787. if len(buf) > 0 {
  788. _p1 = unsafe.Pointer(&buf[0])
  789. } else {
  790. _p1 = unsafe.Pointer(&_zero)
  791. }
  792. runtime.EnterSyscall()
  793. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___READLINKAT_A<<4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(_p1), uintptr(len(buf)))
  794. runtime.ExitSyscall()
  795. n = int(r0)
  796. if int64(r0) == -1 {
  797. err = errnoErr2(e1, e2)
  798. return n, err
  799. } else {
  800. if buf[0] == '$' {
  801. if isSpecialPath(buf[1:9]) {
  802. cnt, err1 := realpath(path, buf)
  803. if err1 == 0 {
  804. n = cnt
  805. }
  806. }
  807. }
  808. }
  809. return
  810. }
  811. //go:nosplit
  812. func get_ReadlinkatAddr() *(func(dirfd int, path string, buf []byte) (n int, err error))
  813. var Readlinkat = enter_Readlinkat
  814. func enter_Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
  815. funcref := get_ReadlinkatAddr()
  816. if funcptrtest(GetZosLibVec()+SYS___READLINKAT_A<<4, "") == 0 {
  817. *funcref = impl_Readlinkat
  818. } else {
  819. *funcref = error_Readlinkat
  820. }
  821. return (*funcref)(dirfd, path, buf)
  822. }
  823. func error_Readlinkat(dirfd int, path string, buf []byte) (n int, err error) {
  824. n = -1
  825. err = ENOSYS
  826. return
  827. }
  828. //sys Mkdir(path string, mode uint32) (err error) = SYS___MKDIR_A
  829. //sys Mkdirat(dirfd int, path string, mode uint32) (err error) = SYS___MKDIRAT_A
  830. //sys Mkfifo(path string, mode uint32) (err error) = SYS___MKFIFO_A
  831. //sys Mknod(path string, mode uint32, dev int) (err error) = SYS___MKNOD_A
  832. //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) = SYS___MKNODAT_A
  833. //sys PivotRoot(newroot string, oldroot string) (err error) = SYS___PIVOT_ROOT_A
  834. //sys Pread(fd int, p []byte, offset int64) (n int, err error)
  835. //sys Pwrite(fd int, p []byte, offset int64) (n int, err error)
  836. //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) = SYS___PRCTL_A
  837. //sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT
  838. //sys Rename(from string, to string) (err error) = SYS___RENAME_A
  839. //sys Renameat(olddirfd int, oldpath string, newdirfd int, newpath string) (err error) = SYS___RENAMEAT_A
  840. //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) = SYS___RENAMEAT2_A
  841. //sys Rmdir(path string) (err error) = SYS___RMDIR_A
  842. //sys Seek(fd int, offset int64, whence int) (off int64, err error) = SYS_LSEEK
  843. //sys Setegid(egid int) (err error) = SYS_SETEGID
  844. //sys Seteuid(euid int) (err error) = SYS_SETEUID
  845. //sys Sethostname(p []byte) (err error) = SYS___SETHOSTNAME_A
  846. //sys Setns(fd int, nstype int) (err error) = SYS_SETNS
  847. //sys Setpriority(which int, who int, prio int) (err error)
  848. //sysnb Setpgid(pid int, pgid int) (err error) = SYS_SETPGID
  849. //sysnb Setrlimit(resource int, lim *Rlimit) (err error)
  850. //sysnb Setregid(rgid int, egid int) (err error) = SYS_SETREGID
  851. //sysnb Setreuid(ruid int, euid int) (err error) = SYS_SETREUID
  852. //sysnb Setsid() (pid int, err error) = SYS_SETSID
  853. //sys Setuid(uid int) (err error) = SYS_SETUID
  854. //sys Setgid(uid int) (err error) = SYS_SETGID
  855. //sys Shutdown(fd int, how int) (err error)
  856. //sys stat(path string, statLE *Stat_LE_t) (err error) = SYS___STAT_A
  857. func Stat(path string, sta *Stat_t) (err error) {
  858. var statLE Stat_LE_t
  859. err = stat(path, &statLE)
  860. copyStat(sta, &statLE)
  861. return
  862. }
  863. //sys Symlink(path string, link string) (err error) = SYS___SYMLINK_A
  864. //sys Symlinkat(oldPath string, dirfd int, newPath string) (err error) = SYS___SYMLINKAT_A
  865. //sys Sync() = SYS_SYNC
  866. //sys Truncate(path string, length int64) (err error) = SYS___TRUNCATE_A
  867. //sys Tcgetattr(fildes int, termptr *Termios) (err error) = SYS_TCGETATTR
  868. //sys Tcsetattr(fildes int, when int, termptr *Termios) (err error) = SYS_TCSETATTR
  869. //sys Umask(mask int) (oldmask int)
  870. //sys Unlink(path string) (err error) = SYS___UNLINK_A
  871. //sys Unlinkat(dirfd int, path string, flags int) (err error) = SYS___UNLINKAT_A
  872. //sys Utime(path string, utim *Utimbuf) (err error) = SYS___UTIME_A
  873. //sys open(path string, mode int, perm uint32) (fd int, err error) = SYS___OPEN_A
  874. func Open(path string, mode int, perm uint32) (fd int, err error) {
  875. if mode&O_ACCMODE == 0 {
  876. mode |= O_RDONLY
  877. }
  878. return open(path, mode, perm)
  879. }
  880. //sys openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) = SYS___OPENAT_A
  881. func Openat(dirfd int, path string, flags int, mode uint32) (fd int, err error) {
  882. if flags&O_ACCMODE == 0 {
  883. flags |= O_RDONLY
  884. }
  885. return openat(dirfd, path, flags, mode)
  886. }
  887. //sys openat2(dirfd int, path string, open_how *OpenHow, size int) (fd int, err error) = SYS___OPENAT2_A
  888. func Openat2(dirfd int, path string, how *OpenHow) (fd int, err error) {
  889. if how.Flags&O_ACCMODE == 0 {
  890. how.Flags |= O_RDONLY
  891. }
  892. return openat2(dirfd, path, how, SizeofOpenHow)
  893. }
  894. func ZosFdToPath(dirfd int) (path string, err error) {
  895. var buffer [1024]byte
  896. runtime.EnterSyscall()
  897. ret, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_W_IOCTL<<4, uintptr(dirfd), 17, 1024, uintptr(unsafe.Pointer(&buffer[0])))
  898. runtime.ExitSyscall()
  899. if ret == 0 {
  900. zb := bytes.IndexByte(buffer[:], 0)
  901. if zb == -1 {
  902. zb = len(buffer)
  903. }
  904. CallLeFuncWithErr(GetZosLibVec()+SYS___E2A_L<<4, uintptr(unsafe.Pointer(&buffer[0])), uintptr(zb))
  905. return string(buffer[:zb]), nil
  906. }
  907. return "", errnoErr2(e1, e2)
  908. }
  909. //sys remove(path string) (err error)
  910. func Remove(path string) error {
  911. return remove(path)
  912. }
  913. const ImplementsGetwd = true
  914. func Getcwd(buf []byte) (n int, err error) {
  915. var p unsafe.Pointer
  916. if len(buf) > 0 {
  917. p = unsafe.Pointer(&buf[0])
  918. } else {
  919. p = unsafe.Pointer(&_zero)
  920. }
  921. runtime.EnterSyscall()
  922. r0, e2, e1 := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___GETCWD_A<<4, uintptr(p), uintptr(len(buf)))
  923. runtime.ExitSyscall()
  924. n = clen(buf) + 1
  925. if r0 == 0 {
  926. err = errnoErr2(e1, e2)
  927. }
  928. return
  929. }
  930. func Getwd() (wd string, err error) {
  931. var buf [PathMax]byte
  932. n, err := Getcwd(buf[0:])
  933. if err != nil {
  934. return "", err
  935. }
  936. // Getcwd returns the number of bytes written to buf, including the NUL.
  937. if n < 1 || n > len(buf) || buf[n-1] != 0 {
  938. return "", EINVAL
  939. }
  940. return string(buf[0 : n-1]), nil
  941. }
  942. func Getgroups() (gids []int, err error) {
  943. n, err := getgroups(0, nil)
  944. if err != nil {
  945. return nil, err
  946. }
  947. if n == 0 {
  948. return nil, nil
  949. }
  950. // Sanity check group count. Max is 1<<16 on Linux.
  951. if n < 0 || n > 1<<20 {
  952. return nil, EINVAL
  953. }
  954. a := make([]_Gid_t, n)
  955. n, err = getgroups(n, &a[0])
  956. if err != nil {
  957. return nil, err
  958. }
  959. gids = make([]int, n)
  960. for i, v := range a[0:n] {
  961. gids[i] = int(v)
  962. }
  963. return
  964. }
  965. func Setgroups(gids []int) (err error) {
  966. if len(gids) == 0 {
  967. return setgroups(0, nil)
  968. }
  969. a := make([]_Gid_t, len(gids))
  970. for i, v := range gids {
  971. a[i] = _Gid_t(v)
  972. }
  973. return setgroups(len(a), &a[0])
  974. }
  975. func gettid() uint64
  976. func Gettid() (tid int) {
  977. return int(gettid())
  978. }
  979. type WaitStatus uint32
  980. // Wait status is 7 bits at bottom, either 0 (exited),
  981. // 0x7F (stopped), or a signal number that caused an exit.
  982. // The 0x80 bit is whether there was a core dump.
  983. // An extra number (exit code, signal causing a stop)
  984. // is in the high bits. At least that's the idea.
  985. // There are various irregularities. For example, the
  986. // "continued" status is 0xFFFF, distinguishing itself
  987. // from stopped via the core dump bit.
  988. const (
  989. mask = 0x7F
  990. core = 0x80
  991. exited = 0x00
  992. stopped = 0x7F
  993. shift = 8
  994. )
  995. func (w WaitStatus) Exited() bool { return w&mask == exited }
  996. func (w WaitStatus) Signaled() bool { return w&mask != stopped && w&mask != exited }
  997. func (w WaitStatus) Stopped() bool { return w&0xFF == stopped }
  998. func (w WaitStatus) Continued() bool { return w == 0xFFFF }
  999. func (w WaitStatus) CoreDump() bool { return w.Signaled() && w&core != 0 }
  1000. func (w WaitStatus) ExitStatus() int {
  1001. if !w.Exited() {
  1002. return -1
  1003. }
  1004. return int(w>>shift) & 0xFF
  1005. }
  1006. func (w WaitStatus) Signal() Signal {
  1007. if !w.Signaled() {
  1008. return -1
  1009. }
  1010. return Signal(w & mask)
  1011. }
  1012. func (w WaitStatus) StopSignal() Signal {
  1013. if !w.Stopped() {
  1014. return -1
  1015. }
  1016. return Signal(w>>shift) & 0xFF
  1017. }
  1018. func (w WaitStatus) TrapCause() int { return -1 }
  1019. //sys waitid(idType int, id int, info *Siginfo, options int) (err error)
  1020. func Waitid(idType int, id int, info *Siginfo, options int, rusage *Rusage) (err error) {
  1021. return waitid(idType, id, info, options)
  1022. }
  1023. //sys waitpid(pid int, wstatus *_C_int, options int) (wpid int, err error)
  1024. func impl_Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
  1025. runtime.EnterSyscall()
  1026. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_WAIT4<<4, uintptr(pid), uintptr(unsafe.Pointer(wstatus)), uintptr(options), uintptr(unsafe.Pointer(rusage)))
  1027. runtime.ExitSyscall()
  1028. wpid = int(r0)
  1029. if int64(r0) == -1 {
  1030. err = errnoErr2(e1, e2)
  1031. }
  1032. return
  1033. }
  1034. //go:nosplit
  1035. func get_Wait4Addr() *(func(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error))
  1036. var Wait4 = enter_Wait4
  1037. func enter_Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
  1038. funcref := get_Wait4Addr()
  1039. if funcptrtest(GetZosLibVec()+SYS_WAIT4<<4, "") == 0 {
  1040. *funcref = impl_Wait4
  1041. } else {
  1042. *funcref = legacyWait4
  1043. }
  1044. return (*funcref)(pid, wstatus, options, rusage)
  1045. }
  1046. func legacyWait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, err error) {
  1047. // TODO(mundaym): z/OS doesn't have wait4. I don't think getrusage does what we want.
  1048. // At the moment rusage will not be touched.
  1049. var status _C_int
  1050. wpid, err = waitpid(pid, &status, options)
  1051. if wstatus != nil {
  1052. *wstatus = WaitStatus(status)
  1053. }
  1054. return
  1055. }
  1056. //sysnb gettimeofday(tv *timeval_zos) (err error)
  1057. func Gettimeofday(tv *Timeval) (err error) {
  1058. var tvz timeval_zos
  1059. err = gettimeofday(&tvz)
  1060. tv.Sec = tvz.Sec
  1061. tv.Usec = int64(tvz.Usec)
  1062. return
  1063. }
  1064. func Time(t *Time_t) (tt Time_t, err error) {
  1065. var tv Timeval
  1066. err = Gettimeofday(&tv)
  1067. if err != nil {
  1068. return 0, err
  1069. }
  1070. if t != nil {
  1071. *t = Time_t(tv.Sec)
  1072. }
  1073. return Time_t(tv.Sec), nil
  1074. }
  1075. func setTimespec(sec, nsec int64) Timespec {
  1076. return Timespec{Sec: sec, Nsec: nsec}
  1077. }
  1078. func setTimeval(sec, usec int64) Timeval { //fix
  1079. return Timeval{Sec: sec, Usec: usec}
  1080. }
  1081. //sysnb pipe(p *[2]_C_int) (err error)
  1082. func Pipe(p []int) (err error) {
  1083. if len(p) != 2 {
  1084. return EINVAL
  1085. }
  1086. var pp [2]_C_int
  1087. err = pipe(&pp)
  1088. p[0] = int(pp[0])
  1089. p[1] = int(pp[1])
  1090. return
  1091. }
  1092. //sys utimes(path string, timeval *[2]Timeval) (err error) = SYS___UTIMES_A
  1093. func Utimes(path string, tv []Timeval) (err error) {
  1094. if tv == nil {
  1095. return utimes(path, nil)
  1096. }
  1097. if len(tv) != 2 {
  1098. return EINVAL
  1099. }
  1100. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  1101. }
  1102. //sys utimensat(dirfd int, path string, ts *[2]Timespec, flags int) (err error) = SYS___UTIMENSAT_A
  1103. func validUtimensat() bool {
  1104. if funcptrtest(GetZosLibVec()+SYS___UTIMENSAT_A<<4, "") == 0 {
  1105. if name, err := getLeFuncName(GetZosLibVec() + SYS___UTIMENSAT_A<<4); err == nil {
  1106. return name == "__utimensat_a"
  1107. }
  1108. }
  1109. return false
  1110. }
  1111. // Begin UtimesNano
  1112. //go:nosplit
  1113. func get_UtimesNanoAddr() *(func(path string, ts []Timespec) (err error))
  1114. var UtimesNano = enter_UtimesNano
  1115. func enter_UtimesNano(path string, ts []Timespec) (err error) {
  1116. funcref := get_UtimesNanoAddr()
  1117. if validUtimensat() {
  1118. *funcref = utimesNanoImpl
  1119. } else {
  1120. *funcref = legacyUtimesNano
  1121. }
  1122. return (*funcref)(path, ts)
  1123. }
  1124. func utimesNanoImpl(path string, ts []Timespec) (err error) {
  1125. if ts == nil {
  1126. return utimensat(AT_FDCWD, path, nil, 0)
  1127. }
  1128. if len(ts) != 2 {
  1129. return EINVAL
  1130. }
  1131. return utimensat(AT_FDCWD, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), 0)
  1132. }
  1133. func legacyUtimesNano(path string, ts []Timespec) (err error) {
  1134. if len(ts) != 2 {
  1135. return EINVAL
  1136. }
  1137. // Not as efficient as it could be because Timespec and
  1138. // Timeval have different types in the different OSes
  1139. tv := [2]Timeval{
  1140. NsecToTimeval(TimespecToNsec(ts[0])),
  1141. NsecToTimeval(TimespecToNsec(ts[1])),
  1142. }
  1143. return utimes(path, (*[2]Timeval)(unsafe.Pointer(&tv[0])))
  1144. }
  1145. // End UtimesNano
  1146. // Begin UtimesNanoAt
  1147. //go:nosplit
  1148. func get_UtimesNanoAtAddr() *(func(dirfd int, path string, ts []Timespec, flags int) (err error))
  1149. var UtimesNanoAt = enter_UtimesNanoAt
  1150. func enter_UtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) (err error) {
  1151. funcref := get_UtimesNanoAtAddr()
  1152. if validUtimensat() {
  1153. *funcref = utimesNanoAtImpl
  1154. } else {
  1155. *funcref = legacyUtimesNanoAt
  1156. }
  1157. return (*funcref)(dirfd, path, ts, flags)
  1158. }
  1159. func utimesNanoAtImpl(dirfd int, path string, ts []Timespec, flags int) (err error) {
  1160. if ts == nil {
  1161. return utimensat(dirfd, path, nil, flags)
  1162. }
  1163. if len(ts) != 2 {
  1164. return EINVAL
  1165. }
  1166. return utimensat(dirfd, path, (*[2]Timespec)(unsafe.Pointer(&ts[0])), flags)
  1167. }
  1168. func legacyUtimesNanoAt(dirfd int, path string, ts []Timespec, flags int) (err error) {
  1169. if path[0] != '/' {
  1170. dirPath, err := ZosFdToPath(dirfd)
  1171. if err != nil {
  1172. return err
  1173. }
  1174. path = dirPath + "/" + path
  1175. }
  1176. if flags == AT_SYMLINK_NOFOLLOW {
  1177. if len(ts) != 2 {
  1178. return EINVAL
  1179. }
  1180. if ts[0].Nsec >= 5e8 {
  1181. ts[0].Sec++
  1182. }
  1183. ts[0].Nsec = 0
  1184. if ts[1].Nsec >= 5e8 {
  1185. ts[1].Sec++
  1186. }
  1187. ts[1].Nsec = 0
  1188. // Not as efficient as it could be because Timespec and
  1189. // Timeval have different types in the different OSes
  1190. tv := []Timeval{
  1191. NsecToTimeval(TimespecToNsec(ts[0])),
  1192. NsecToTimeval(TimespecToNsec(ts[1])),
  1193. }
  1194. return Lutimes(path, tv)
  1195. }
  1196. return UtimesNano(path, ts)
  1197. }
  1198. // End UtimesNanoAt
  1199. func Getsockname(fd int) (sa Sockaddr, err error) {
  1200. var rsa RawSockaddrAny
  1201. var len _Socklen = SizeofSockaddrAny
  1202. if err = getsockname(fd, &rsa, &len); err != nil {
  1203. return
  1204. }
  1205. // TODO(neeilan) : Remove this 0 ( added to get sys/unix compiling on z/OS )
  1206. return anyToSockaddr(0, &rsa)
  1207. }
  1208. const (
  1209. // identifier constants
  1210. nwmHeaderIdentifier = 0xd5e6d4c8
  1211. nwmFilterIdentifier = 0xd5e6d4c6
  1212. nwmTCPConnIdentifier = 0xd5e6d4c3
  1213. nwmRecHeaderIdentifier = 0xd5e6d4d9
  1214. nwmIPStatsIdentifier = 0xd5e6d4c9d7e2e340
  1215. nwmIPGStatsIdentifier = 0xd5e6d4c9d7c7e2e3
  1216. nwmTCPStatsIdentifier = 0xd5e6d4e3c3d7e2e3
  1217. nwmUDPStatsIdentifier = 0xd5e6d4e4c4d7e2e3
  1218. nwmICMPGStatsEntry = 0xd5e6d4c9c3d4d7c7
  1219. nwmICMPTStatsEntry = 0xd5e6d4c9c3d4d7e3
  1220. // nwmHeader constants
  1221. nwmVersion1 = 1
  1222. nwmVersion2 = 2
  1223. nwmCurrentVer = 2
  1224. nwmTCPConnType = 1
  1225. nwmGlobalStatsType = 14
  1226. // nwmFilter constants
  1227. nwmFilterLclAddrMask = 0x20000000 // Local address
  1228. nwmFilterSrcAddrMask = 0x20000000 // Source address
  1229. nwmFilterLclPortMask = 0x10000000 // Local port
  1230. nwmFilterSrcPortMask = 0x10000000 // Source port
  1231. // nwmConnEntry constants
  1232. nwmTCPStateClosed = 1
  1233. nwmTCPStateListen = 2
  1234. nwmTCPStateSynSent = 3
  1235. nwmTCPStateSynRcvd = 4
  1236. nwmTCPStateEstab = 5
  1237. nwmTCPStateFinWait1 = 6
  1238. nwmTCPStateFinWait2 = 7
  1239. nwmTCPStateClosWait = 8
  1240. nwmTCPStateLastAck = 9
  1241. nwmTCPStateClosing = 10
  1242. nwmTCPStateTimeWait = 11
  1243. nwmTCPStateDeletTCB = 12
  1244. // Existing constants on linux
  1245. BPF_TCP_CLOSE = 1
  1246. BPF_TCP_LISTEN = 2
  1247. BPF_TCP_SYN_SENT = 3
  1248. BPF_TCP_SYN_RECV = 4
  1249. BPF_TCP_ESTABLISHED = 5
  1250. BPF_TCP_FIN_WAIT1 = 6
  1251. BPF_TCP_FIN_WAIT2 = 7
  1252. BPF_TCP_CLOSE_WAIT = 8
  1253. BPF_TCP_LAST_ACK = 9
  1254. BPF_TCP_CLOSING = 10
  1255. BPF_TCP_TIME_WAIT = 11
  1256. BPF_TCP_NEW_SYN_RECV = -1
  1257. BPF_TCP_MAX_STATES = -2
  1258. )
  1259. type nwmTriplet struct {
  1260. offset uint32
  1261. length uint32
  1262. number uint32
  1263. }
  1264. type nwmQuadruplet struct {
  1265. offset uint32
  1266. length uint32
  1267. number uint32
  1268. match uint32
  1269. }
  1270. type nwmHeader struct {
  1271. ident uint32
  1272. length uint32
  1273. version uint16
  1274. nwmType uint16
  1275. bytesNeeded uint32
  1276. options uint32
  1277. _ [16]byte
  1278. inputDesc nwmTriplet
  1279. outputDesc nwmQuadruplet
  1280. }
  1281. type nwmFilter struct {
  1282. ident uint32
  1283. flags uint32
  1284. resourceName [8]byte
  1285. resourceId uint32
  1286. listenerId uint32
  1287. local [28]byte // union of sockaddr4 and sockaddr6
  1288. remote [28]byte // union of sockaddr4 and sockaddr6
  1289. _ uint16
  1290. _ uint16
  1291. asid uint16
  1292. _ [2]byte
  1293. tnLuName [8]byte
  1294. tnMonGrp uint32
  1295. tnAppl [8]byte
  1296. applData [40]byte
  1297. nInterface [16]byte
  1298. dVipa [16]byte
  1299. dVipaPfx uint16
  1300. dVipaPort uint16
  1301. dVipaFamily byte
  1302. _ [3]byte
  1303. destXCF [16]byte
  1304. destXCFPfx uint16
  1305. destXCFFamily byte
  1306. _ [1]byte
  1307. targIP [16]byte
  1308. targIPPfx uint16
  1309. targIPFamily byte
  1310. _ [1]byte
  1311. _ [20]byte
  1312. }
  1313. type nwmRecHeader struct {
  1314. ident uint32
  1315. length uint32
  1316. number byte
  1317. _ [3]byte
  1318. }
  1319. type nwmTCPStatsEntry struct {
  1320. ident uint64
  1321. currEstab uint32
  1322. activeOpened uint32
  1323. passiveOpened uint32
  1324. connClosed uint32
  1325. estabResets uint32
  1326. attemptFails uint32
  1327. passiveDrops uint32
  1328. timeWaitReused uint32
  1329. inSegs uint64
  1330. predictAck uint32
  1331. predictData uint32
  1332. inDupAck uint32
  1333. inBadSum uint32
  1334. inBadLen uint32
  1335. inShort uint32
  1336. inDiscOldTime uint32
  1337. inAllBeforeWin uint32
  1338. inSomeBeforeWin uint32
  1339. inAllAfterWin uint32
  1340. inSomeAfterWin uint32
  1341. inOutOfOrder uint32
  1342. inAfterClose uint32
  1343. inWinProbes uint32
  1344. inWinUpdates uint32
  1345. outWinUpdates uint32
  1346. outSegs uint64
  1347. outDelayAcks uint32
  1348. outRsts uint32
  1349. retransSegs uint32
  1350. retransTimeouts uint32
  1351. retransDrops uint32
  1352. pmtuRetrans uint32
  1353. pmtuErrors uint32
  1354. outWinProbes uint32
  1355. probeDrops uint32
  1356. keepAliveProbes uint32
  1357. keepAliveDrops uint32
  1358. finwait2Drops uint32
  1359. acceptCount uint64
  1360. inBulkQSegs uint64
  1361. inDiscards uint64
  1362. connFloods uint32
  1363. connStalls uint32
  1364. cfgEphemDef uint16
  1365. ephemInUse uint16
  1366. ephemHiWater uint16
  1367. flags byte
  1368. _ [1]byte
  1369. ephemExhaust uint32
  1370. smcRCurrEstabLnks uint32
  1371. smcRLnkActTimeOut uint32
  1372. smcRActLnkOpened uint32
  1373. smcRPasLnkOpened uint32
  1374. smcRLnksClosed uint32
  1375. smcRCurrEstab uint32
  1376. smcRActiveOpened uint32
  1377. smcRPassiveOpened uint32
  1378. smcRConnClosed uint32
  1379. smcRInSegs uint64
  1380. smcROutSegs uint64
  1381. smcRInRsts uint32
  1382. smcROutRsts uint32
  1383. smcDCurrEstabLnks uint32
  1384. smcDActLnkOpened uint32
  1385. smcDPasLnkOpened uint32
  1386. smcDLnksClosed uint32
  1387. smcDCurrEstab uint32
  1388. smcDActiveOpened uint32
  1389. smcDPassiveOpened uint32
  1390. smcDConnClosed uint32
  1391. smcDInSegs uint64
  1392. smcDOutSegs uint64
  1393. smcDInRsts uint32
  1394. smcDOutRsts uint32
  1395. }
  1396. type nwmConnEntry struct {
  1397. ident uint32
  1398. local [28]byte // union of sockaddr4 and sockaddr6
  1399. remote [28]byte // union of sockaddr4 and sockaddr6
  1400. startTime [8]byte // uint64, changed to prevent padding from being inserted
  1401. lastActivity [8]byte // uint64
  1402. bytesIn [8]byte // uint64
  1403. bytesOut [8]byte // uint64
  1404. inSegs [8]byte // uint64
  1405. outSegs [8]byte // uint64
  1406. state uint16
  1407. activeOpen byte
  1408. flag01 byte
  1409. outBuffered uint32
  1410. inBuffered uint32
  1411. maxSndWnd uint32
  1412. reXmtCount uint32
  1413. congestionWnd uint32
  1414. ssThresh uint32
  1415. roundTripTime uint32
  1416. roundTripVar uint32
  1417. sendMSS uint32
  1418. sndWnd uint32
  1419. rcvBufSize uint32
  1420. sndBufSize uint32
  1421. outOfOrderCount uint32
  1422. lcl0WindowCount uint32
  1423. rmt0WindowCount uint32
  1424. dupacks uint32
  1425. flag02 byte
  1426. sockOpt6Cont byte
  1427. asid uint16
  1428. resourceName [8]byte
  1429. resourceId uint32
  1430. subtask uint32
  1431. sockOpt byte
  1432. sockOpt6 byte
  1433. clusterConnFlag byte
  1434. proto byte
  1435. targetAppl [8]byte
  1436. luName [8]byte
  1437. clientUserId [8]byte
  1438. logMode [8]byte
  1439. timeStamp uint32
  1440. timeStampAge uint32
  1441. serverResourceId uint32
  1442. intfName [16]byte
  1443. ttlsStatPol byte
  1444. ttlsStatConn byte
  1445. ttlsSSLProt uint16
  1446. ttlsNegCiph [2]byte
  1447. ttlsSecType byte
  1448. ttlsFIPS140Mode byte
  1449. ttlsUserID [8]byte
  1450. applData [40]byte
  1451. inOldestTime [8]byte // uint64
  1452. outOldestTime [8]byte // uint64
  1453. tcpTrustedPartner byte
  1454. _ [3]byte
  1455. bulkDataIntfName [16]byte
  1456. ttlsNegCiph4 [4]byte
  1457. smcReason uint32
  1458. lclSMCLinkId uint32
  1459. rmtSMCLinkId uint32
  1460. smcStatus byte
  1461. smcFlags byte
  1462. _ [2]byte
  1463. rcvWnd uint32
  1464. lclSMCBufSz uint32
  1465. rmtSMCBufSz uint32
  1466. ttlsSessID [32]byte
  1467. ttlsSessIDLen int16
  1468. _ [1]byte
  1469. smcDStatus byte
  1470. smcDReason uint32
  1471. }
  1472. var svcNameTable [][]byte = [][]byte{
  1473. []byte("\xc5\xe9\xc2\xd5\xd4\xc9\xc6\xf4"), // svc_EZBNMIF4
  1474. }
  1475. const (
  1476. svc_EZBNMIF4 = 0
  1477. )
  1478. func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) {
  1479. jobname := []byte("\x5c\x40\x40\x40\x40\x40\x40\x40") // "*"
  1480. responseBuffer := [4096]byte{0}
  1481. var bufferAlet, reasonCode uint32 = 0, 0
  1482. var bufferLen, returnValue, returnCode int32 = 4096, 0, 0
  1483. dsa := [18]uint64{0}
  1484. var argv [7]unsafe.Pointer
  1485. argv[0] = unsafe.Pointer(&jobname[0])
  1486. argv[1] = unsafe.Pointer(&responseBuffer[0])
  1487. argv[2] = unsafe.Pointer(&bufferAlet)
  1488. argv[3] = unsafe.Pointer(&bufferLen)
  1489. argv[4] = unsafe.Pointer(&returnValue)
  1490. argv[5] = unsafe.Pointer(&returnCode)
  1491. argv[6] = unsafe.Pointer(&reasonCode)
  1492. request := (*struct {
  1493. header nwmHeader
  1494. filter nwmFilter
  1495. })(unsafe.Pointer(&responseBuffer[0]))
  1496. EZBNMIF4 := svcLoad(&svcNameTable[svc_EZBNMIF4][0])
  1497. if EZBNMIF4 == nil {
  1498. return nil, errnoErr(EINVAL)
  1499. }
  1500. // GetGlobalStats EZBNMIF4 call
  1501. request.header.ident = nwmHeaderIdentifier
  1502. request.header.length = uint32(unsafe.Sizeof(request.header))
  1503. request.header.version = nwmCurrentVer
  1504. request.header.nwmType = nwmGlobalStatsType
  1505. request.header.options = 0x80000000
  1506. svcCall(EZBNMIF4, &argv[0], &dsa[0])
  1507. // outputDesc field is filled by EZBNMIF4 on success
  1508. if returnCode != 0 || request.header.outputDesc.offset == 0 {
  1509. return nil, errnoErr(EINVAL)
  1510. }
  1511. // Check that EZBNMIF4 returned a nwmRecHeader
  1512. recHeader := (*nwmRecHeader)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset]))
  1513. if recHeader.ident != nwmRecHeaderIdentifier {
  1514. return nil, errnoErr(EINVAL)
  1515. }
  1516. // Parse nwmTriplets to get offsets of returned entries
  1517. var sections []*uint64
  1518. var sectionDesc *nwmTriplet = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[0]))
  1519. for i := uint32(0); i < uint32(recHeader.number); i++ {
  1520. offset := request.header.outputDesc.offset + uint32(unsafe.Sizeof(*recHeader)) + i*uint32(unsafe.Sizeof(*sectionDesc))
  1521. sectionDesc = (*nwmTriplet)(unsafe.Pointer(&responseBuffer[offset]))
  1522. for j := uint32(0); j < sectionDesc.number; j++ {
  1523. offset = request.header.outputDesc.offset + sectionDesc.offset + j*sectionDesc.length
  1524. sections = append(sections, (*uint64)(unsafe.Pointer(&responseBuffer[offset])))
  1525. }
  1526. }
  1527. // Find nwmTCPStatsEntry in returned entries
  1528. var tcpStats *nwmTCPStatsEntry = nil
  1529. for _, ptr := range sections {
  1530. switch *ptr {
  1531. case nwmTCPStatsIdentifier:
  1532. if tcpStats != nil {
  1533. return nil, errnoErr(EINVAL)
  1534. }
  1535. tcpStats = (*nwmTCPStatsEntry)(unsafe.Pointer(ptr))
  1536. case nwmIPStatsIdentifier:
  1537. case nwmIPGStatsIdentifier:
  1538. case nwmUDPStatsIdentifier:
  1539. case nwmICMPGStatsEntry:
  1540. case nwmICMPTStatsEntry:
  1541. default:
  1542. return nil, errnoErr(EINVAL)
  1543. }
  1544. }
  1545. if tcpStats == nil {
  1546. return nil, errnoErr(EINVAL)
  1547. }
  1548. // GetConnectionDetail EZBNMIF4 call
  1549. responseBuffer = [4096]byte{0}
  1550. dsa = [18]uint64{0}
  1551. bufferAlet, reasonCode = 0, 0
  1552. bufferLen, returnValue, returnCode = 4096, 0, 0
  1553. nameptr := (*uint32)(unsafe.Pointer(uintptr(0x21c))) // Get jobname of current process
  1554. nameptr = (*uint32)(unsafe.Pointer(uintptr(*nameptr + 12)))
  1555. argv[0] = unsafe.Pointer(uintptr(*nameptr))
  1556. request.header.ident = nwmHeaderIdentifier
  1557. request.header.length = uint32(unsafe.Sizeof(request.header))
  1558. request.header.version = nwmCurrentVer
  1559. request.header.nwmType = nwmTCPConnType
  1560. request.header.options = 0x80000000
  1561. request.filter.ident = nwmFilterIdentifier
  1562. var localSockaddr RawSockaddrAny
  1563. socklen := _Socklen(SizeofSockaddrAny)
  1564. err := getsockname(fd, &localSockaddr, &socklen)
  1565. if err != nil {
  1566. return nil, errnoErr(EINVAL)
  1567. }
  1568. if localSockaddr.Addr.Family == AF_INET {
  1569. localSockaddr := (*RawSockaddrInet4)(unsafe.Pointer(&localSockaddr.Addr))
  1570. localSockFilter := (*RawSockaddrInet4)(unsafe.Pointer(&request.filter.local[0]))
  1571. localSockFilter.Family = AF_INET
  1572. var i int
  1573. for i = 0; i < 4; i++ {
  1574. if localSockaddr.Addr[i] != 0 {
  1575. break
  1576. }
  1577. }
  1578. if i != 4 {
  1579. request.filter.flags |= nwmFilterLclAddrMask
  1580. for i = 0; i < 4; i++ {
  1581. localSockFilter.Addr[i] = localSockaddr.Addr[i]
  1582. }
  1583. }
  1584. if localSockaddr.Port != 0 {
  1585. request.filter.flags |= nwmFilterLclPortMask
  1586. localSockFilter.Port = localSockaddr.Port
  1587. }
  1588. } else if localSockaddr.Addr.Family == AF_INET6 {
  1589. localSockaddr := (*RawSockaddrInet6)(unsafe.Pointer(&localSockaddr.Addr))
  1590. localSockFilter := (*RawSockaddrInet6)(unsafe.Pointer(&request.filter.local[0]))
  1591. localSockFilter.Family = AF_INET6
  1592. var i int
  1593. for i = 0; i < 16; i++ {
  1594. if localSockaddr.Addr[i] != 0 {
  1595. break
  1596. }
  1597. }
  1598. if i != 16 {
  1599. request.filter.flags |= nwmFilterLclAddrMask
  1600. for i = 0; i < 16; i++ {
  1601. localSockFilter.Addr[i] = localSockaddr.Addr[i]
  1602. }
  1603. }
  1604. if localSockaddr.Port != 0 {
  1605. request.filter.flags |= nwmFilterLclPortMask
  1606. localSockFilter.Port = localSockaddr.Port
  1607. }
  1608. }
  1609. svcCall(EZBNMIF4, &argv[0], &dsa[0])
  1610. // outputDesc field is filled by EZBNMIF4 on success
  1611. if returnCode != 0 || request.header.outputDesc.offset == 0 {
  1612. return nil, errnoErr(EINVAL)
  1613. }
  1614. // Check that EZBNMIF4 returned a nwmConnEntry
  1615. conn := (*nwmConnEntry)(unsafe.Pointer(&responseBuffer[request.header.outputDesc.offset]))
  1616. if conn.ident != nwmTCPConnIdentifier {
  1617. return nil, errnoErr(EINVAL)
  1618. }
  1619. // Copy data from the returned data structures into tcpInfo
  1620. // Stats from nwmConnEntry are specific to that connection.
  1621. // Stats from nwmTCPStatsEntry are global (to the interface?)
  1622. // Fields may not be an exact match. Some fields have no equivalent.
  1623. var tcpinfo TCPInfo
  1624. tcpinfo.State = uint8(conn.state)
  1625. tcpinfo.Ca_state = 0 // dummy
  1626. tcpinfo.Retransmits = uint8(tcpStats.retransSegs)
  1627. tcpinfo.Probes = uint8(tcpStats.outWinProbes)
  1628. tcpinfo.Backoff = 0 // dummy
  1629. tcpinfo.Options = 0 // dummy
  1630. tcpinfo.Rto = tcpStats.retransTimeouts
  1631. tcpinfo.Ato = tcpStats.outDelayAcks
  1632. tcpinfo.Snd_mss = conn.sendMSS
  1633. tcpinfo.Rcv_mss = conn.sendMSS // dummy
  1634. tcpinfo.Unacked = 0 // dummy
  1635. tcpinfo.Sacked = 0 // dummy
  1636. tcpinfo.Lost = 0 // dummy
  1637. tcpinfo.Retrans = conn.reXmtCount
  1638. tcpinfo.Fackets = 0 // dummy
  1639. tcpinfo.Last_data_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.lastActivity[0])))
  1640. tcpinfo.Last_ack_sent = uint32(*(*uint64)(unsafe.Pointer(&conn.outOldestTime[0])))
  1641. tcpinfo.Last_data_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0])))
  1642. tcpinfo.Last_ack_recv = uint32(*(*uint64)(unsafe.Pointer(&conn.inOldestTime[0])))
  1643. tcpinfo.Pmtu = conn.sendMSS // dummy, NWMIfRouteMtu is a candidate
  1644. tcpinfo.Rcv_ssthresh = conn.ssThresh
  1645. tcpinfo.Rtt = conn.roundTripTime
  1646. tcpinfo.Rttvar = conn.roundTripVar
  1647. tcpinfo.Snd_ssthresh = conn.ssThresh // dummy
  1648. tcpinfo.Snd_cwnd = conn.congestionWnd
  1649. tcpinfo.Advmss = conn.sendMSS // dummy
  1650. tcpinfo.Reordering = 0 // dummy
  1651. tcpinfo.Rcv_rtt = conn.roundTripTime // dummy
  1652. tcpinfo.Rcv_space = conn.sendMSS // dummy
  1653. tcpinfo.Total_retrans = conn.reXmtCount
  1654. svcUnload(&svcNameTable[svc_EZBNMIF4][0], EZBNMIF4)
  1655. return &tcpinfo, nil
  1656. }
  1657. // GetsockoptString returns the string value of the socket option opt for the
  1658. // socket associated with fd at the given socket level.
  1659. func GetsockoptString(fd, level, opt int) (string, error) {
  1660. buf := make([]byte, 256)
  1661. vallen := _Socklen(len(buf))
  1662. err := getsockopt(fd, level, opt, unsafe.Pointer(&buf[0]), &vallen)
  1663. if err != nil {
  1664. return "", err
  1665. }
  1666. return ByteSliceToString(buf[:vallen]), nil
  1667. }
  1668. func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) {
  1669. var msg Msghdr
  1670. var rsa RawSockaddrAny
  1671. msg.Name = (*byte)(unsafe.Pointer(&rsa))
  1672. msg.Namelen = SizeofSockaddrAny
  1673. var iov Iovec
  1674. if len(p) > 0 {
  1675. iov.Base = (*byte)(unsafe.Pointer(&p[0]))
  1676. iov.SetLen(len(p))
  1677. }
  1678. var dummy byte
  1679. if len(oob) > 0 {
  1680. // receive at least one normal byte
  1681. if len(p) == 0 {
  1682. iov.Base = &dummy
  1683. iov.SetLen(1)
  1684. }
  1685. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  1686. msg.SetControllen(len(oob))
  1687. }
  1688. msg.Iov = &iov
  1689. msg.Iovlen = 1
  1690. if n, err = recvmsg(fd, &msg, flags); err != nil {
  1691. return
  1692. }
  1693. oobn = int(msg.Controllen)
  1694. recvflags = int(msg.Flags)
  1695. // source address is only specified if the socket is unconnected
  1696. if rsa.Addr.Family != AF_UNSPEC {
  1697. // TODO(neeilan): Remove 0 arg added to get this compiling on z/OS
  1698. from, err = anyToSockaddr(0, &rsa)
  1699. }
  1700. return
  1701. }
  1702. func Sendmsg(fd int, p, oob []byte, to Sockaddr, flags int) (err error) {
  1703. _, err = SendmsgN(fd, p, oob, to, flags)
  1704. return
  1705. }
  1706. func SendmsgN(fd int, p, oob []byte, to Sockaddr, flags int) (n int, err error) {
  1707. var ptr unsafe.Pointer
  1708. var salen _Socklen
  1709. if to != nil {
  1710. var err error
  1711. ptr, salen, err = to.sockaddr()
  1712. if err != nil {
  1713. return 0, err
  1714. }
  1715. }
  1716. var msg Msghdr
  1717. msg.Name = (*byte)(unsafe.Pointer(ptr))
  1718. msg.Namelen = int32(salen)
  1719. var iov Iovec
  1720. if len(p) > 0 {
  1721. iov.Base = (*byte)(unsafe.Pointer(&p[0]))
  1722. iov.SetLen(len(p))
  1723. }
  1724. var dummy byte
  1725. if len(oob) > 0 {
  1726. // send at least one normal byte
  1727. if len(p) == 0 {
  1728. iov.Base = &dummy
  1729. iov.SetLen(1)
  1730. }
  1731. msg.Control = (*byte)(unsafe.Pointer(&oob[0]))
  1732. msg.SetControllen(len(oob))
  1733. }
  1734. msg.Iov = &iov
  1735. msg.Iovlen = 1
  1736. if n, err = sendmsg(fd, &msg, flags); err != nil {
  1737. return 0, err
  1738. }
  1739. if len(oob) > 0 && len(p) == 0 {
  1740. n = 0
  1741. }
  1742. return n, nil
  1743. }
  1744. func Opendir(name string) (uintptr, error) {
  1745. p, err := BytePtrFromString(name)
  1746. if err != nil {
  1747. return 0, err
  1748. }
  1749. err = nil
  1750. runtime.EnterSyscall()
  1751. dir, e2, e1 := CallLeFuncWithPtrReturn(GetZosLibVec()+SYS___OPENDIR_A<<4, uintptr(unsafe.Pointer(p)))
  1752. runtime.ExitSyscall()
  1753. runtime.KeepAlive(unsafe.Pointer(p))
  1754. if dir == 0 {
  1755. err = errnoErr2(e1, e2)
  1756. }
  1757. return dir, err
  1758. }
  1759. // clearsyscall.Errno resets the errno value to 0.
  1760. func clearErrno()
  1761. func Closedir(dir uintptr) error {
  1762. runtime.EnterSyscall()
  1763. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_CLOSEDIR<<4, dir)
  1764. runtime.ExitSyscall()
  1765. if r0 != 0 {
  1766. return errnoErr2(e1, e2)
  1767. }
  1768. return nil
  1769. }
  1770. func Seekdir(dir uintptr, pos int) {
  1771. runtime.EnterSyscall()
  1772. CallLeFuncWithErr(GetZosLibVec()+SYS_SEEKDIR<<4, dir, uintptr(pos))
  1773. runtime.ExitSyscall()
  1774. }
  1775. func Telldir(dir uintptr) (int, error) {
  1776. p, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_TELLDIR<<4, dir)
  1777. pos := int(p)
  1778. if int64(p) == -1 {
  1779. return pos, errnoErr2(e1, e2)
  1780. }
  1781. return pos, nil
  1782. }
  1783. // FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command.
  1784. func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error {
  1785. // struct flock is packed on z/OS. We can't emulate that in Go so
  1786. // instead we pack it here.
  1787. var flock [24]byte
  1788. *(*int16)(unsafe.Pointer(&flock[0])) = lk.Type
  1789. *(*int16)(unsafe.Pointer(&flock[2])) = lk.Whence
  1790. *(*int64)(unsafe.Pointer(&flock[4])) = lk.Start
  1791. *(*int64)(unsafe.Pointer(&flock[12])) = lk.Len
  1792. *(*int32)(unsafe.Pointer(&flock[20])) = lk.Pid
  1793. runtime.EnterSyscall()
  1794. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_FCNTL<<4, fd, uintptr(cmd), uintptr(unsafe.Pointer(&flock)))
  1795. runtime.ExitSyscall()
  1796. lk.Type = *(*int16)(unsafe.Pointer(&flock[0]))
  1797. lk.Whence = *(*int16)(unsafe.Pointer(&flock[2]))
  1798. lk.Start = *(*int64)(unsafe.Pointer(&flock[4]))
  1799. lk.Len = *(*int64)(unsafe.Pointer(&flock[12]))
  1800. lk.Pid = *(*int32)(unsafe.Pointer(&flock[20]))
  1801. if r0 == 0 {
  1802. return nil
  1803. }
  1804. return errnoErr2(e1, e2)
  1805. }
  1806. func impl_Flock(fd int, how int) (err error) {
  1807. runtime.EnterSyscall()
  1808. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_FLOCK<<4, uintptr(fd), uintptr(how))
  1809. runtime.ExitSyscall()
  1810. if int64(r0) == -1 {
  1811. err = errnoErr2(e1, e2)
  1812. }
  1813. return
  1814. }
  1815. //go:nosplit
  1816. func get_FlockAddr() *(func(fd int, how int) (err error))
  1817. var Flock = enter_Flock
  1818. func validFlock(fp uintptr) bool {
  1819. if funcptrtest(GetZosLibVec()+SYS_FLOCK<<4, "") == 0 {
  1820. if name, err := getLeFuncName(GetZosLibVec() + SYS_FLOCK<<4); err == nil {
  1821. return name == "flock"
  1822. }
  1823. }
  1824. return false
  1825. }
  1826. func enter_Flock(fd int, how int) (err error) {
  1827. funcref := get_FlockAddr()
  1828. if validFlock(GetZosLibVec() + SYS_FLOCK<<4) {
  1829. *funcref = impl_Flock
  1830. } else {
  1831. *funcref = legacyFlock
  1832. }
  1833. return (*funcref)(fd, how)
  1834. }
  1835. func legacyFlock(fd int, how int) error {
  1836. var flock_type int16
  1837. var fcntl_cmd int
  1838. switch how {
  1839. case LOCK_SH | LOCK_NB:
  1840. flock_type = F_RDLCK
  1841. fcntl_cmd = F_SETLK
  1842. case LOCK_EX | LOCK_NB:
  1843. flock_type = F_WRLCK
  1844. fcntl_cmd = F_SETLK
  1845. case LOCK_EX:
  1846. flock_type = F_WRLCK
  1847. fcntl_cmd = F_SETLKW
  1848. case LOCK_UN:
  1849. flock_type = F_UNLCK
  1850. fcntl_cmd = F_SETLKW
  1851. default:
  1852. }
  1853. flock := Flock_t{
  1854. Type: int16(flock_type),
  1855. Whence: int16(0),
  1856. Start: int64(0),
  1857. Len: int64(0),
  1858. Pid: int32(Getppid()),
  1859. }
  1860. err := FcntlFlock(uintptr(fd), fcntl_cmd, &flock)
  1861. return err
  1862. }
  1863. func Mlock(b []byte) (err error) {
  1864. runtime.EnterSyscall()
  1865. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MLOCKALL<<4, _BPX_NONSWAP)
  1866. runtime.ExitSyscall()
  1867. if r0 != 0 {
  1868. err = errnoErr2(e1, e2)
  1869. }
  1870. return
  1871. }
  1872. func Mlock2(b []byte, flags int) (err error) {
  1873. runtime.EnterSyscall()
  1874. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MLOCKALL<<4, _BPX_NONSWAP)
  1875. runtime.ExitSyscall()
  1876. if r0 != 0 {
  1877. err = errnoErr2(e1, e2)
  1878. }
  1879. return
  1880. }
  1881. func Mlockall(flags int) (err error) {
  1882. runtime.EnterSyscall()
  1883. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MLOCKALL<<4, _BPX_NONSWAP)
  1884. runtime.ExitSyscall()
  1885. if r0 != 0 {
  1886. err = errnoErr2(e1, e2)
  1887. }
  1888. return
  1889. }
  1890. func Munlock(b []byte) (err error) {
  1891. runtime.EnterSyscall()
  1892. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MLOCKALL<<4, _BPX_SWAP)
  1893. runtime.ExitSyscall()
  1894. if r0 != 0 {
  1895. err = errnoErr2(e1, e2)
  1896. }
  1897. return
  1898. }
  1899. func Munlockall() (err error) {
  1900. runtime.EnterSyscall()
  1901. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MLOCKALL<<4, _BPX_SWAP)
  1902. runtime.ExitSyscall()
  1903. if r0 != 0 {
  1904. err = errnoErr2(e1, e2)
  1905. }
  1906. return
  1907. }
  1908. func ClockGettime(clockid int32, ts *Timespec) error {
  1909. var ticks_per_sec uint32 = 100 //TODO(kenan): value is currently hardcoded; need sysconf() call otherwise
  1910. var nsec_per_sec int64 = 1000000000
  1911. if ts == nil {
  1912. return EFAULT
  1913. }
  1914. if clockid == CLOCK_REALTIME || clockid == CLOCK_MONOTONIC {
  1915. var nanotime int64 = runtime.Nanotime1()
  1916. ts.Sec = nanotime / nsec_per_sec
  1917. ts.Nsec = nanotime % nsec_per_sec
  1918. } else if clockid == CLOCK_PROCESS_CPUTIME_ID || clockid == CLOCK_THREAD_CPUTIME_ID {
  1919. var tm Tms
  1920. _, err := Times(&tm)
  1921. if err != nil {
  1922. return EFAULT
  1923. }
  1924. ts.Sec = int64(tm.Utime / ticks_per_sec)
  1925. ts.Nsec = int64(tm.Utime) * nsec_per_sec / int64(ticks_per_sec)
  1926. } else {
  1927. return EINVAL
  1928. }
  1929. return nil
  1930. }
  1931. // Chtag
  1932. //go:nosplit
  1933. func get_ChtagAddr() *(func(path string, ccsid uint64, textbit uint64) error)
  1934. var Chtag = enter_Chtag
  1935. func enter_Chtag(path string, ccsid uint64, textbit uint64) error {
  1936. funcref := get_ChtagAddr()
  1937. if validSetxattr() {
  1938. *funcref = impl_Chtag
  1939. } else {
  1940. *funcref = legacy_Chtag
  1941. }
  1942. return (*funcref)(path, ccsid, textbit)
  1943. }
  1944. func legacy_Chtag(path string, ccsid uint64, textbit uint64) error {
  1945. tag := ccsid<<16 | textbit<<15
  1946. var tag_buff [8]byte
  1947. DecodeData(tag_buff[:], 8, tag)
  1948. return Setxattr(path, "filetag", tag_buff[:], XATTR_REPLACE)
  1949. }
  1950. func impl_Chtag(path string, ccsid uint64, textbit uint64) error {
  1951. tag := ccsid<<16 | textbit<<15
  1952. var tag_buff [4]byte
  1953. DecodeData(tag_buff[:], 4, tag)
  1954. return Setxattr(path, "system.filetag", tag_buff[:], XATTR_REPLACE)
  1955. }
  1956. // End of Chtag
  1957. // Nanosleep
  1958. //go:nosplit
  1959. func get_NanosleepAddr() *(func(time *Timespec, leftover *Timespec) error)
  1960. var Nanosleep = enter_Nanosleep
  1961. func enter_Nanosleep(time *Timespec, leftover *Timespec) error {
  1962. funcref := get_NanosleepAddr()
  1963. if funcptrtest(GetZosLibVec()+SYS_NANOSLEEP<<4, "") == 0 {
  1964. *funcref = impl_Nanosleep
  1965. } else {
  1966. *funcref = legacyNanosleep
  1967. }
  1968. return (*funcref)(time, leftover)
  1969. }
  1970. func impl_Nanosleep(time *Timespec, leftover *Timespec) error {
  1971. runtime.EnterSyscall()
  1972. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS_NANOSLEEP<<4, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)))
  1973. runtime.ExitSyscall()
  1974. if int64(r0) == -1 {
  1975. return errnoErr2(e1, e2)
  1976. }
  1977. return nil
  1978. }
  1979. func legacyNanosleep(time *Timespec, leftover *Timespec) error {
  1980. t0 := runtime.Nanotime1()
  1981. var secrem uint32
  1982. var nsecrem uint32
  1983. total := time.Sec*1000000000 + time.Nsec
  1984. elapsed := runtime.Nanotime1() - t0
  1985. var rv int32
  1986. var rc int32
  1987. var err error
  1988. // repeatedly sleep for 1 second until less than 1 second left
  1989. for total-elapsed > 1000000000 {
  1990. rv, rc, _ = BpxCondTimedWait(uint32(1), uint32(0), uint32(CW_CONDVAR), &secrem, &nsecrem)
  1991. if rv != 0 && rc != 112 { // 112 is EAGAIN
  1992. if leftover != nil && rc == 120 { // 120 is EINTR
  1993. leftover.Sec = int64(secrem)
  1994. leftover.Nsec = int64(nsecrem)
  1995. }
  1996. err = Errno(rc)
  1997. return err
  1998. }
  1999. elapsed = runtime.Nanotime1() - t0
  2000. }
  2001. // sleep the remainder
  2002. if total > elapsed {
  2003. rv, rc, _ = BpxCondTimedWait(uint32(0), uint32(total-elapsed), uint32(CW_CONDVAR), &secrem, &nsecrem)
  2004. }
  2005. if leftover != nil && rc == 120 {
  2006. leftover.Sec = int64(secrem)
  2007. leftover.Nsec = int64(nsecrem)
  2008. }
  2009. if rv != 0 && rc != 112 {
  2010. err = Errno(rc)
  2011. }
  2012. return err
  2013. }
  2014. // End of Nanosleep
  2015. var (
  2016. Stdin = 0
  2017. Stdout = 1
  2018. Stderr = 2
  2019. )
  2020. // Do the interface allocations only once for common
  2021. // Errno values.
  2022. var (
  2023. errEAGAIN error = syscall.EAGAIN
  2024. errEINVAL error = syscall.EINVAL
  2025. errENOENT error = syscall.ENOENT
  2026. )
  2027. var ZosTraceLevel int
  2028. var ZosTracefile *os.File
  2029. var (
  2030. signalNameMapOnce sync.Once
  2031. signalNameMap map[string]syscall.Signal
  2032. )
  2033. // errnoErr returns common boxed Errno values, to prevent
  2034. // allocations at runtime.
  2035. func errnoErr(e Errno) error {
  2036. switch e {
  2037. case 0:
  2038. return nil
  2039. case EAGAIN:
  2040. return errEAGAIN
  2041. case EINVAL:
  2042. return errEINVAL
  2043. case ENOENT:
  2044. return errENOENT
  2045. }
  2046. return e
  2047. }
  2048. var reg *regexp.Regexp
  2049. // enhanced with zos specific errno2
  2050. func errnoErr2(e Errno, e2 uintptr) error {
  2051. switch e {
  2052. case 0:
  2053. return nil
  2054. case EAGAIN:
  2055. return errEAGAIN
  2056. /*
  2057. Allow the retrieval of errno2 for EINVAL and ENOENT on zos
  2058. case EINVAL:
  2059. return errEINVAL
  2060. case ENOENT:
  2061. return errENOENT
  2062. */
  2063. }
  2064. if ZosTraceLevel > 0 {
  2065. var name string
  2066. if reg == nil {
  2067. reg = regexp.MustCompile("(^unix\\.[^/]+$|.*\\/unix\\.[^/]+$)")
  2068. }
  2069. i := 1
  2070. pc, file, line, ok := runtime.Caller(i)
  2071. if ok {
  2072. name = runtime.FuncForPC(pc).Name()
  2073. }
  2074. for ok && reg.MatchString(runtime.FuncForPC(pc).Name()) {
  2075. i += 1
  2076. pc, file, line, ok = runtime.Caller(i)
  2077. }
  2078. if ok {
  2079. if ZosTracefile == nil {
  2080. ZosConsolePrintf("From %s:%d\n", file, line)
  2081. ZosConsolePrintf("%s: %s (errno2=0x%x)\n", name, e.Error(), e2)
  2082. } else {
  2083. fmt.Fprintf(ZosTracefile, "From %s:%d\n", file, line)
  2084. fmt.Fprintf(ZosTracefile, "%s: %s (errno2=0x%x)\n", name, e.Error(), e2)
  2085. }
  2086. } else {
  2087. if ZosTracefile == nil {
  2088. ZosConsolePrintf("%s (errno2=0x%x)\n", e.Error(), e2)
  2089. } else {
  2090. fmt.Fprintf(ZosTracefile, "%s (errno2=0x%x)\n", e.Error(), e2)
  2091. }
  2092. }
  2093. }
  2094. return e
  2095. }
  2096. // ErrnoName returns the error name for error number e.
  2097. func ErrnoName(e Errno) string {
  2098. i := sort.Search(len(errorList), func(i int) bool {
  2099. return errorList[i].num >= e
  2100. })
  2101. if i < len(errorList) && errorList[i].num == e {
  2102. return errorList[i].name
  2103. }
  2104. return ""
  2105. }
  2106. // SignalName returns the signal name for signal number s.
  2107. func SignalName(s syscall.Signal) string {
  2108. i := sort.Search(len(signalList), func(i int) bool {
  2109. return signalList[i].num >= s
  2110. })
  2111. if i < len(signalList) && signalList[i].num == s {
  2112. return signalList[i].name
  2113. }
  2114. return ""
  2115. }
  2116. // SignalNum returns the syscall.Signal for signal named s,
  2117. // or 0 if a signal with such name is not found.
  2118. // The signal name should start with "SIG".
  2119. func SignalNum(s string) syscall.Signal {
  2120. signalNameMapOnce.Do(func() {
  2121. signalNameMap = make(map[string]syscall.Signal, len(signalList))
  2122. for _, signal := range signalList {
  2123. signalNameMap[signal.name] = signal.num
  2124. }
  2125. })
  2126. return signalNameMap[s]
  2127. }
  2128. // clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte.
  2129. func clen(n []byte) int {
  2130. i := bytes.IndexByte(n, 0)
  2131. if i == -1 {
  2132. i = len(n)
  2133. }
  2134. return i
  2135. }
  2136. // Mmap manager, for use by operating system-specific implementations.
  2137. type mmapper struct {
  2138. sync.Mutex
  2139. active map[*byte][]byte // active mappings; key is last byte in mapping
  2140. mmap func(addr, length uintptr, prot, flags, fd int, offset int64) (uintptr, error)
  2141. munmap func(addr uintptr, length uintptr) error
  2142. }
  2143. func (m *mmapper) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) {
  2144. if length <= 0 {
  2145. return nil, EINVAL
  2146. }
  2147. // Set __MAP_64 by default
  2148. flags |= __MAP_64
  2149. // Map the requested memory.
  2150. addr, errno := m.mmap(0, uintptr(length), prot, flags, fd, offset)
  2151. if errno != nil {
  2152. return nil, errno
  2153. }
  2154. // Slice memory layout
  2155. var sl = struct {
  2156. addr uintptr
  2157. len int
  2158. cap int
  2159. }{addr, length, length}
  2160. // Use unsafe to turn sl into a []byte.
  2161. b := *(*[]byte)(unsafe.Pointer(&sl))
  2162. // Register mapping in m and return it.
  2163. p := &b[cap(b)-1]
  2164. m.Lock()
  2165. defer m.Unlock()
  2166. m.active[p] = b
  2167. return b, nil
  2168. }
  2169. func (m *mmapper) Munmap(data []byte) (err error) {
  2170. if len(data) == 0 || len(data) != cap(data) {
  2171. return EINVAL
  2172. }
  2173. // Find the base of the mapping.
  2174. p := &data[cap(data)-1]
  2175. m.Lock()
  2176. defer m.Unlock()
  2177. b := m.active[p]
  2178. if b == nil || &b[0] != &data[0] {
  2179. return EINVAL
  2180. }
  2181. // Unmap the memory and update m.
  2182. if errno := m.munmap(uintptr(unsafe.Pointer(&b[0])), uintptr(len(b))); errno != nil {
  2183. return errno
  2184. }
  2185. delete(m.active, p)
  2186. return nil
  2187. }
  2188. func Read(fd int, p []byte) (n int, err error) {
  2189. n, err = read(fd, p)
  2190. if raceenabled {
  2191. if n > 0 {
  2192. raceWriteRange(unsafe.Pointer(&p[0]), n)
  2193. }
  2194. if err == nil {
  2195. raceAcquire(unsafe.Pointer(&ioSync))
  2196. }
  2197. }
  2198. return
  2199. }
  2200. func Write(fd int, p []byte) (n int, err error) {
  2201. if raceenabled {
  2202. raceReleaseMerge(unsafe.Pointer(&ioSync))
  2203. }
  2204. n, err = write(fd, p)
  2205. if raceenabled && n > 0 {
  2206. raceReadRange(unsafe.Pointer(&p[0]), n)
  2207. }
  2208. return
  2209. }
  2210. // For testing: clients can set this flag to force
  2211. // creation of IPv6 sockets to return EAFNOSUPPORT.
  2212. var SocketDisableIPv6 bool
  2213. // Sockaddr represents a socket address.
  2214. type Sockaddr interface {
  2215. sockaddr() (ptr unsafe.Pointer, len _Socklen, err error) // lowercase; only we can define Sockaddrs
  2216. }
  2217. // SockaddrInet4 implements the Sockaddr interface for AF_INET type sockets.
  2218. type SockaddrInet4 struct {
  2219. Port int
  2220. Addr [4]byte
  2221. raw RawSockaddrInet4
  2222. }
  2223. // SockaddrInet6 implements the Sockaddr interface for AF_INET6 type sockets.
  2224. type SockaddrInet6 struct {
  2225. Port int
  2226. ZoneId uint32
  2227. Addr [16]byte
  2228. raw RawSockaddrInet6
  2229. }
  2230. // SockaddrUnix implements the Sockaddr interface for AF_UNIX type sockets.
  2231. type SockaddrUnix struct {
  2232. Name string
  2233. raw RawSockaddrUnix
  2234. }
  2235. func Bind(fd int, sa Sockaddr) (err error) {
  2236. ptr, n, err := sa.sockaddr()
  2237. if err != nil {
  2238. return err
  2239. }
  2240. return bind(fd, ptr, n)
  2241. }
  2242. func Connect(fd int, sa Sockaddr) (err error) {
  2243. ptr, n, err := sa.sockaddr()
  2244. if err != nil {
  2245. return err
  2246. }
  2247. return connect(fd, ptr, n)
  2248. }
  2249. func Getpeername(fd int) (sa Sockaddr, err error) {
  2250. var rsa RawSockaddrAny
  2251. var len _Socklen = SizeofSockaddrAny
  2252. if err = getpeername(fd, &rsa, &len); err != nil {
  2253. return
  2254. }
  2255. return anyToSockaddr(fd, &rsa)
  2256. }
  2257. func GetsockoptByte(fd, level, opt int) (value byte, err error) {
  2258. var n byte
  2259. vallen := _Socklen(1)
  2260. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  2261. return n, err
  2262. }
  2263. func GetsockoptInt(fd, level, opt int) (value int, err error) {
  2264. var n int32
  2265. vallen := _Socklen(4)
  2266. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  2267. return int(n), err
  2268. }
  2269. func GetsockoptInet4Addr(fd, level, opt int) (value [4]byte, err error) {
  2270. vallen := _Socklen(4)
  2271. err = getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen)
  2272. return value, err
  2273. }
  2274. func GetsockoptIPMreq(fd, level, opt int) (*IPMreq, error) {
  2275. var value IPMreq
  2276. vallen := _Socklen(SizeofIPMreq)
  2277. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  2278. return &value, err
  2279. }
  2280. func GetsockoptIPv6Mreq(fd, level, opt int) (*IPv6Mreq, error) {
  2281. var value IPv6Mreq
  2282. vallen := _Socklen(SizeofIPv6Mreq)
  2283. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  2284. return &value, err
  2285. }
  2286. func GetsockoptIPv6MTUInfo(fd, level, opt int) (*IPv6MTUInfo, error) {
  2287. var value IPv6MTUInfo
  2288. vallen := _Socklen(SizeofIPv6MTUInfo)
  2289. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  2290. return &value, err
  2291. }
  2292. func GetsockoptICMPv6Filter(fd, level, opt int) (*ICMPv6Filter, error) {
  2293. var value ICMPv6Filter
  2294. vallen := _Socklen(SizeofICMPv6Filter)
  2295. err := getsockopt(fd, level, opt, unsafe.Pointer(&value), &vallen)
  2296. return &value, err
  2297. }
  2298. func GetsockoptLinger(fd, level, opt int) (*Linger, error) {
  2299. var linger Linger
  2300. vallen := _Socklen(SizeofLinger)
  2301. err := getsockopt(fd, level, opt, unsafe.Pointer(&linger), &vallen)
  2302. return &linger, err
  2303. }
  2304. func GetsockoptTimeval(fd, level, opt int) (*Timeval, error) {
  2305. var tv Timeval
  2306. vallen := _Socklen(unsafe.Sizeof(tv))
  2307. err := getsockopt(fd, level, opt, unsafe.Pointer(&tv), &vallen)
  2308. return &tv, err
  2309. }
  2310. func GetsockoptUint64(fd, level, opt int) (value uint64, err error) {
  2311. var n uint64
  2312. vallen := _Socklen(8)
  2313. err = getsockopt(fd, level, opt, unsafe.Pointer(&n), &vallen)
  2314. return n, err
  2315. }
  2316. func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) {
  2317. var rsa RawSockaddrAny
  2318. var len _Socklen = SizeofSockaddrAny
  2319. if n, err = recvfrom(fd, p, flags, &rsa, &len); err != nil {
  2320. return
  2321. }
  2322. if rsa.Addr.Family != AF_UNSPEC {
  2323. from, err = anyToSockaddr(fd, &rsa)
  2324. }
  2325. return
  2326. }
  2327. func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) {
  2328. ptr, n, err := to.sockaddr()
  2329. if err != nil {
  2330. return err
  2331. }
  2332. return sendto(fd, p, flags, ptr, n)
  2333. }
  2334. func SetsockoptByte(fd, level, opt int, value byte) (err error) {
  2335. return setsockopt(fd, level, opt, unsafe.Pointer(&value), 1)
  2336. }
  2337. func SetsockoptInt(fd, level, opt int, value int) (err error) {
  2338. var n = int32(value)
  2339. return setsockopt(fd, level, opt, unsafe.Pointer(&n), 4)
  2340. }
  2341. func SetsockoptInet4Addr(fd, level, opt int, value [4]byte) (err error) {
  2342. return setsockopt(fd, level, opt, unsafe.Pointer(&value[0]), 4)
  2343. }
  2344. func SetsockoptIPMreq(fd, level, opt int, mreq *IPMreq) (err error) {
  2345. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPMreq)
  2346. }
  2347. func SetsockoptIPv6Mreq(fd, level, opt int, mreq *IPv6Mreq) (err error) {
  2348. return setsockopt(fd, level, opt, unsafe.Pointer(mreq), SizeofIPv6Mreq)
  2349. }
  2350. func SetsockoptICMPv6Filter(fd, level, opt int, filter *ICMPv6Filter) error {
  2351. return setsockopt(fd, level, opt, unsafe.Pointer(filter), SizeofICMPv6Filter)
  2352. }
  2353. func SetsockoptLinger(fd, level, opt int, l *Linger) (err error) {
  2354. return setsockopt(fd, level, opt, unsafe.Pointer(l), SizeofLinger)
  2355. }
  2356. func SetsockoptString(fd, level, opt int, s string) (err error) {
  2357. var p unsafe.Pointer
  2358. if len(s) > 0 {
  2359. p = unsafe.Pointer(&[]byte(s)[0])
  2360. }
  2361. return setsockopt(fd, level, opt, p, uintptr(len(s)))
  2362. }
  2363. func SetsockoptTimeval(fd, level, opt int, tv *Timeval) (err error) {
  2364. return setsockopt(fd, level, opt, unsafe.Pointer(tv), unsafe.Sizeof(*tv))
  2365. }
  2366. func SetsockoptUint64(fd, level, opt int, value uint64) (err error) {
  2367. return setsockopt(fd, level, opt, unsafe.Pointer(&value), 8)
  2368. }
  2369. func Socket(domain, typ, proto int) (fd int, err error) {
  2370. if domain == AF_INET6 && SocketDisableIPv6 {
  2371. return -1, EAFNOSUPPORT
  2372. }
  2373. fd, err = socket(domain, typ, proto)
  2374. return
  2375. }
  2376. func Socketpair(domain, typ, proto int) (fd [2]int, err error) {
  2377. var fdx [2]int32
  2378. err = socketpair(domain, typ, proto, &fdx)
  2379. if err == nil {
  2380. fd[0] = int(fdx[0])
  2381. fd[1] = int(fdx[1])
  2382. }
  2383. return
  2384. }
  2385. var ioSync int64
  2386. func CloseOnExec(fd int) { fcntl(fd, F_SETFD, FD_CLOEXEC) }
  2387. func SetNonblock(fd int, nonblocking bool) (err error) {
  2388. flag, err := fcntl(fd, F_GETFL, 0)
  2389. if err != nil {
  2390. return err
  2391. }
  2392. if nonblocking {
  2393. flag |= O_NONBLOCK
  2394. } else {
  2395. flag &= ^O_NONBLOCK
  2396. }
  2397. _, err = fcntl(fd, F_SETFL, flag)
  2398. return err
  2399. }
  2400. // Exec calls execve(2), which replaces the calling executable in the process
  2401. // tree. argv0 should be the full path to an executable ("/bin/ls") and the
  2402. // executable name should also be the first argument in argv (["ls", "-l"]).
  2403. // envv are the environment variables that should be passed to the new
  2404. // process (["USER=go", "PWD=/tmp"]).
  2405. func Exec(argv0 string, argv []string, envv []string) error {
  2406. return syscall.Exec(argv0, argv, envv)
  2407. }
  2408. func Getag(path string) (ccsid uint16, flag uint16, err error) {
  2409. var val [8]byte
  2410. sz, err := Getxattr(path, "ccsid", val[:])
  2411. if err != nil {
  2412. return
  2413. }
  2414. ccsid = uint16(EncodeData(val[0:sz]))
  2415. sz, err = Getxattr(path, "flags", val[:])
  2416. if err != nil {
  2417. return
  2418. }
  2419. flag = uint16(EncodeData(val[0:sz]) >> 15)
  2420. return
  2421. }
  2422. // Mount begin
  2423. func impl_Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
  2424. var _p0 *byte
  2425. _p0, err = BytePtrFromString(source)
  2426. if err != nil {
  2427. return
  2428. }
  2429. var _p1 *byte
  2430. _p1, err = BytePtrFromString(target)
  2431. if err != nil {
  2432. return
  2433. }
  2434. var _p2 *byte
  2435. _p2, err = BytePtrFromString(fstype)
  2436. if err != nil {
  2437. return
  2438. }
  2439. var _p3 *byte
  2440. _p3, err = BytePtrFromString(data)
  2441. if err != nil {
  2442. return
  2443. }
  2444. runtime.EnterSyscall()
  2445. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MOUNT1_A<<4, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(unsafe.Pointer(_p2)), uintptr(flags), uintptr(unsafe.Pointer(_p3)))
  2446. runtime.ExitSyscall()
  2447. if int64(r0) == -1 {
  2448. err = errnoErr2(e1, e2)
  2449. }
  2450. return
  2451. }
  2452. //go:nosplit
  2453. func get_MountAddr() *(func(source string, target string, fstype string, flags uintptr, data string) (err error))
  2454. var Mount = enter_Mount
  2455. func enter_Mount(source string, target string, fstype string, flags uintptr, data string) (err error) {
  2456. funcref := get_MountAddr()
  2457. if validMount() {
  2458. *funcref = impl_Mount
  2459. } else {
  2460. *funcref = legacyMount
  2461. }
  2462. return (*funcref)(source, target, fstype, flags, data)
  2463. }
  2464. func legacyMount(source string, target string, fstype string, flags uintptr, data string) (err error) {
  2465. if needspace := 8 - len(fstype); needspace <= 0 {
  2466. fstype = fstype[0:8]
  2467. } else {
  2468. fstype += " "[0:needspace]
  2469. }
  2470. return mount_LE(target, source, fstype, uint32(flags), int32(len(data)), data)
  2471. }
  2472. func validMount() bool {
  2473. if funcptrtest(GetZosLibVec()+SYS___MOUNT1_A<<4, "") == 0 {
  2474. if name, err := getLeFuncName(GetZosLibVec() + SYS___MOUNT1_A<<4); err == nil {
  2475. return name == "__mount1_a"
  2476. }
  2477. }
  2478. return false
  2479. }
  2480. // Mount end
  2481. // Unmount begin
  2482. func impl_Unmount(target string, flags int) (err error) {
  2483. var _p0 *byte
  2484. _p0, err = BytePtrFromString(target)
  2485. if err != nil {
  2486. return
  2487. }
  2488. runtime.EnterSyscall()
  2489. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___UMOUNT2_A<<4, uintptr(unsafe.Pointer(_p0)), uintptr(flags))
  2490. runtime.ExitSyscall()
  2491. if int64(r0) == -1 {
  2492. err = errnoErr2(e1, e2)
  2493. }
  2494. return
  2495. }
  2496. //go:nosplit
  2497. func get_UnmountAddr() *(func(target string, flags int) (err error))
  2498. var Unmount = enter_Unmount
  2499. func enter_Unmount(target string, flags int) (err error) {
  2500. funcref := get_UnmountAddr()
  2501. if funcptrtest(GetZosLibVec()+SYS___UMOUNT2_A<<4, "") == 0 {
  2502. *funcref = impl_Unmount
  2503. } else {
  2504. *funcref = legacyUnmount
  2505. }
  2506. return (*funcref)(target, flags)
  2507. }
  2508. func legacyUnmount(name string, mtm int) (err error) {
  2509. // mountpoint is always a full path and starts with a '/'
  2510. // check if input string is not a mountpoint but a filesystem name
  2511. if name[0] != '/' {
  2512. return unmount_LE(name, mtm)
  2513. }
  2514. // treat name as mountpoint
  2515. b2s := func(arr []byte) string {
  2516. var str string
  2517. for i := 0; i < len(arr); i++ {
  2518. if arr[i] == 0 {
  2519. str = string(arr[:i])
  2520. break
  2521. }
  2522. }
  2523. return str
  2524. }
  2525. var buffer struct {
  2526. header W_Mnth
  2527. fsinfo [64]W_Mntent
  2528. }
  2529. fs_count, err := W_Getmntent_A((*byte)(unsafe.Pointer(&buffer)), int(unsafe.Sizeof(buffer)))
  2530. if err == nil {
  2531. err = EINVAL
  2532. for i := 0; i < fs_count; i++ {
  2533. if b2s(buffer.fsinfo[i].Mountpoint[:]) == name {
  2534. err = unmount_LE(b2s(buffer.fsinfo[i].Fsname[:]), mtm)
  2535. break
  2536. }
  2537. }
  2538. } else if fs_count == 0 {
  2539. err = EINVAL
  2540. }
  2541. return err
  2542. }
  2543. // Unmount end
  2544. func direntIno(buf []byte) (uint64, bool) {
  2545. return readInt(buf, unsafe.Offsetof(Dirent{}.Ino), unsafe.Sizeof(Dirent{}.Ino))
  2546. }
  2547. func direntReclen(buf []byte) (uint64, bool) {
  2548. return readInt(buf, unsafe.Offsetof(Dirent{}.Reclen), unsafe.Sizeof(Dirent{}.Reclen))
  2549. }
  2550. func direntNamlen(buf []byte) (uint64, bool) {
  2551. reclen, ok := direntReclen(buf)
  2552. if !ok {
  2553. return 0, false
  2554. }
  2555. return reclen - uint64(unsafe.Offsetof(Dirent{}.Name)), true
  2556. }
  2557. func direntLeToDirentUnix(dirent *direntLE, dir uintptr, path string) (Dirent, error) {
  2558. var d Dirent
  2559. d.Ino = uint64(dirent.Ino)
  2560. offset, err := Telldir(dir)
  2561. if err != nil {
  2562. return d, err
  2563. }
  2564. d.Off = int64(offset)
  2565. s := string(bytes.Split(dirent.Name[:], []byte{0})[0])
  2566. copy(d.Name[:], s)
  2567. d.Reclen = uint16(24 + len(d.NameString()))
  2568. var st Stat_t
  2569. path = path + "/" + s
  2570. err = Lstat(path, &st)
  2571. if err != nil {
  2572. return d, err
  2573. }
  2574. d.Type = uint8(st.Mode >> 24)
  2575. return d, err
  2576. }
  2577. func Getdirentries(fd int, buf []byte, basep *uintptr) (n int, err error) {
  2578. // Simulation of Getdirentries port from the Darwin implementation.
  2579. // COMMENTS FROM DARWIN:
  2580. // It's not the full required semantics, but should handle the case
  2581. // of calling Getdirentries or ReadDirent repeatedly.
  2582. // It won't handle assigning the results of lseek to *basep, or handle
  2583. // the directory being edited underfoot.
  2584. skip, err := Seek(fd, 0, 1 /* SEEK_CUR */)
  2585. if err != nil {
  2586. return 0, err
  2587. }
  2588. // Get path from fd to avoid unavailable call (fdopendir)
  2589. path, err := ZosFdToPath(fd)
  2590. if err != nil {
  2591. return 0, err
  2592. }
  2593. d, err := Opendir(path)
  2594. if err != nil {
  2595. return 0, err
  2596. }
  2597. defer Closedir(d)
  2598. var cnt int64
  2599. for {
  2600. var entryLE direntLE
  2601. var entrypLE *direntLE
  2602. e := Readdir_r(d, &entryLE, &entrypLE)
  2603. if e != nil {
  2604. return n, e
  2605. }
  2606. if entrypLE == nil {
  2607. break
  2608. }
  2609. if skip > 0 {
  2610. skip--
  2611. cnt++
  2612. continue
  2613. }
  2614. // Dirent on zos has a different structure
  2615. entry, e := direntLeToDirentUnix(&entryLE, d, path)
  2616. if e != nil {
  2617. return n, e
  2618. }
  2619. reclen := int(entry.Reclen)
  2620. if reclen > len(buf) {
  2621. // Not enough room. Return for now.
  2622. // The counter will let us know where we should start up again.
  2623. // Note: this strategy for suspending in the middle and
  2624. // restarting is O(n^2) in the length of the directory. Oh well.
  2625. break
  2626. }
  2627. // Copy entry into return buffer.
  2628. s := unsafe.Slice((*byte)(unsafe.Pointer(&entry)), reclen)
  2629. copy(buf, s)
  2630. buf = buf[reclen:]
  2631. n += reclen
  2632. cnt++
  2633. }
  2634. // Set the seek offset of the input fd to record
  2635. // how many files we've already returned.
  2636. _, err = Seek(fd, cnt, 0 /* SEEK_SET */)
  2637. if err != nil {
  2638. return n, err
  2639. }
  2640. return n, nil
  2641. }
  2642. func Err2ad() (eadd *int) {
  2643. r0, _, _ := CallLeFuncWithErr(GetZosLibVec() + SYS___ERR2AD<<4)
  2644. eadd = (*int)(unsafe.Pointer(r0))
  2645. return
  2646. }
  2647. func ZosConsolePrintf(format string, v ...interface{}) (int, error) {
  2648. type __cmsg struct {
  2649. _ uint16
  2650. _ [2]uint8
  2651. __msg_length uint32
  2652. __msg uintptr
  2653. _ [4]uint8
  2654. }
  2655. msg := fmt.Sprintf(format, v...)
  2656. strptr := unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&msg)).Data)
  2657. len := (*reflect.StringHeader)(unsafe.Pointer(&msg)).Len
  2658. cmsg := __cmsg{__msg_length: uint32(len), __msg: uintptr(strptr)}
  2659. cmd := uint32(0)
  2660. runtime.EnterSyscall()
  2661. rc, err2, err1 := CallLeFuncWithErr(GetZosLibVec()+SYS_____CONSOLE_A<<4, uintptr(unsafe.Pointer(&cmsg)), 0, uintptr(unsafe.Pointer(&cmd)))
  2662. runtime.ExitSyscall()
  2663. if rc != 0 {
  2664. return 0, fmt.Errorf("%s (errno2=0x%x)\n", err1.Error(), err2)
  2665. }
  2666. return 0, nil
  2667. }
  2668. func ZosStringToEbcdicBytes(str string, nullterm bool) (ebcdicBytes []byte) {
  2669. if nullterm {
  2670. ebcdicBytes = []byte(str + "\x00")
  2671. } else {
  2672. ebcdicBytes = []byte(str)
  2673. }
  2674. A2e(ebcdicBytes)
  2675. return
  2676. }
  2677. func ZosEbcdicBytesToString(b []byte, trimRight bool) (str string) {
  2678. res := make([]byte, len(b))
  2679. copy(res, b)
  2680. E2a(res)
  2681. if trimRight {
  2682. str = string(bytes.TrimRight(res, " \x00"))
  2683. } else {
  2684. str = string(res)
  2685. }
  2686. return
  2687. }
  2688. func fdToPath(dirfd int) (path string, err error) {
  2689. var buffer [1024]byte
  2690. // w_ctrl()
  2691. ret := runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS_W_IOCTL<<4,
  2692. []uintptr{uintptr(dirfd), 17, 1024, uintptr(unsafe.Pointer(&buffer[0]))})
  2693. if ret == 0 {
  2694. zb := bytes.IndexByte(buffer[:], 0)
  2695. if zb == -1 {
  2696. zb = len(buffer)
  2697. }
  2698. // __e2a_l()
  2699. runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___E2A_L<<4,
  2700. []uintptr{uintptr(unsafe.Pointer(&buffer[0])), uintptr(zb)})
  2701. return string(buffer[:zb]), nil
  2702. }
  2703. // __errno()
  2704. errno := int(*(*int32)(unsafe.Pointer(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO<<4,
  2705. []uintptr{}))))
  2706. // __errno2()
  2707. errno2 := int(runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS___ERRNO2<<4,
  2708. []uintptr{}))
  2709. // strerror_r()
  2710. ret = runtime.CallLeFuncByPtr(runtime.XplinkLibvec+SYS_STRERROR_R<<4,
  2711. []uintptr{uintptr(errno), uintptr(unsafe.Pointer(&buffer[0])), 1024})
  2712. if ret == 0 {
  2713. zb := bytes.IndexByte(buffer[:], 0)
  2714. if zb == -1 {
  2715. zb = len(buffer)
  2716. }
  2717. return "", fmt.Errorf("%s (errno2=0x%x)", buffer[:zb], errno2)
  2718. } else {
  2719. return "", fmt.Errorf("fdToPath errno %d (errno2=0x%x)", errno, errno2)
  2720. }
  2721. }
  2722. func impl_Mkfifoat(dirfd int, path string, mode uint32) (err error) {
  2723. var _p0 *byte
  2724. _p0, err = BytePtrFromString(path)
  2725. if err != nil {
  2726. return
  2727. }
  2728. runtime.EnterSyscall()
  2729. r0, e2, e1 := CallLeFuncWithErr(GetZosLibVec()+SYS___MKFIFOAT_A<<4, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode))
  2730. runtime.ExitSyscall()
  2731. if int64(r0) == -1 {
  2732. err = errnoErr2(e1, e2)
  2733. }
  2734. return
  2735. }
  2736. //go:nosplit
  2737. func get_MkfifoatAddr() *(func(dirfd int, path string, mode uint32) (err error))
  2738. var Mkfifoat = enter_Mkfifoat
  2739. func enter_Mkfifoat(dirfd int, path string, mode uint32) (err error) {
  2740. funcref := get_MkfifoatAddr()
  2741. if funcptrtest(GetZosLibVec()+SYS___MKFIFOAT_A<<4, "") == 0 {
  2742. *funcref = impl_Mkfifoat
  2743. } else {
  2744. *funcref = legacy_Mkfifoat
  2745. }
  2746. return (*funcref)(dirfd, path, mode)
  2747. }
  2748. func legacy_Mkfifoat(dirfd int, path string, mode uint32) (err error) {
  2749. dirname, err := ZosFdToPath(dirfd)
  2750. if err != nil {
  2751. return err
  2752. }
  2753. return Mkfifo(dirname+"/"+path, mode)
  2754. }
  2755. //sys Posix_openpt(oflag int) (fd int, err error) = SYS_POSIX_OPENPT
  2756. //sys Grantpt(fildes int) (rc int, err error) = SYS_GRANTPT
  2757. //sys Unlockpt(fildes int) (rc int, err error) = SYS_UNLOCKPT