posix.nim 55 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127
  1. #
  2. #
  3. # Nim's Runtime Library
  4. # (c) Copyright 2012 Andreas Rumpf
  5. #
  6. # See the file "copying.txt", included in this
  7. # distribution, for details about the copyright.
  8. #
  9. # Until std_arg!!
  10. # done: ipc, pwd, stat, semaphore, sys/types, sys/utsname, pthread, unistd,
  11. # statvfs, mman, time, wait, signal, nl_types, sched, spawn, select, ucontext,
  12. # net/if, sys/socket, sys/uio, netinet/in, netinet/tcp, netdb
  13. ## This is a raw POSIX interface module. It does not not provide any
  14. ## convenience: cstrings are used instead of proper Nim strings and
  15. ## return codes indicate errors. If you want exceptions
  16. ## and a proper Nim-like interface, use the OS module or write a wrapper.
  17. ##
  18. ## For high-level wrappers specialized for Linux and BSDs see:
  19. ## `posix_utils <posix_utils.html>`_
  20. ##
  21. ## Coding conventions:
  22. ## ALL types are named the same as in the POSIX standard except that they start
  23. ## with 'T' or 'P' (if they are pointers) and without the '_t' suffix to be
  24. ## consistent with Nim conventions. If an identifier is a Nim keyword
  25. ## the \`identifier\` notation is used.
  26. ##
  27. ## This library relies on the header files of your C compiler. The
  28. ## resulting C code will just `#include <XYZ.h>` and *not* define the
  29. ## symbols declared here.
  30. # Dead code elimination ensures that we don't accidentally generate #includes
  31. # for files that might not exist on a specific platform! The user will get an
  32. # error only if they actually try to use the missing declaration
  33. when defined(nimHasStyleChecks):
  34. {.push styleChecks: off.}
  35. when defined(nimPreviewSlimSystem):
  36. import std/syncio
  37. # TODO these constants don't seem to be fetched from a header file for unknown
  38. # platforms - where do they come from and why are they here?
  39. when false:
  40. const
  41. C_IRUSR = 0o000400 ## Read by owner.
  42. C_IWUSR = 0o000200 ## Write by owner.
  43. C_IXUSR = 0o000100 ## Execute by owner.
  44. C_IRGRP = 0o000040 ## Read by group.
  45. C_IWGRP = 0o000020 ## Write by group.
  46. C_IXGRP = 0o000010 ## Execute by group.
  47. C_IROTH = 0o000004 ## Read by others.
  48. C_IWOTH = 0o000002 ## Write by others.
  49. C_IXOTH = 0o000001 ## Execute by others.
  50. C_ISUID = 0o004000 ## Set user ID.
  51. C_ISGID = 0o002000 ## Set group ID.
  52. C_ISVTX = 0o001000 ## On directories, restricted deletion flag.
  53. C_ISDIR = 0o040000 ## Directory.
  54. C_ISFIFO = 0o010000 ##FIFO.
  55. C_ISREG = 0o100000 ## Regular file.
  56. C_ISBLK = 0o060000 ## Block special.
  57. C_ISCHR = 0o020000 ## Character special.
  58. C_ISCTG = 0o110000 ## Reserved.
  59. C_ISLNK = 0o120000 ## Symbolic link.</p>
  60. C_ISSOCK = 0o140000 ## Socket.
  61. const
  62. MM_NULLLBL* = nil
  63. MM_NULLSEV* = 0
  64. MM_NULLMC* = 0
  65. MM_NULLTXT* = nil
  66. MM_NULLACT* = nil
  67. MM_NULLTAG* = nil
  68. STDERR_FILENO* = 2 ## File number of stderr;
  69. STDIN_FILENO* = 0 ## File number of stdin;
  70. STDOUT_FILENO* = 1 ## File number of stdout;
  71. DT_UNKNOWN* = 0 ## Unknown file type.
  72. DT_FIFO* = 1 ## Named pipe, or FIFO.
  73. DT_CHR* = 2 ## Character device.
  74. DT_DIR* = 4 ## Directory.
  75. DT_BLK* = 6 ## Block device.
  76. DT_REG* = 8 ## Regular file.
  77. DT_LNK* = 10 ## Symbolic link.
  78. DT_SOCK* = 12 ## UNIX domain socket.
  79. DT_WHT* = 14
  80. # Special types
  81. type Sighandler = proc (a: cint) {.noconv.}
  82. const StatHasNanoseconds* = defined(linux) or defined(freebsd) or
  83. defined(osx) or defined(openbsd) or defined(dragonfly) or defined(haiku) ## \
  84. ## Boolean flag that indicates if the system supports nanosecond time
  85. ## resolution in the fields of `Stat`. Note that the nanosecond based fields
  86. ## (`Stat.st_atim`, `Stat.st_mtim` and `Stat.st_ctim`) can be accessed
  87. ## without checking this flag, because this module defines fallback procs
  88. ## when they are not available.
  89. # Platform specific stuff
  90. when (defined(linux) and not defined(android)) and defined(amd64):
  91. include posix_linux_amd64
  92. elif defined(openbsd) and defined(amd64):
  93. include posix_openbsd_amd64
  94. elif (defined(macos) or defined(macosx) or defined(bsd)) and defined(cpu64):
  95. include posix_macos_amd64
  96. elif defined(nintendoswitch):
  97. include posix_nintendoswitch
  98. elif defined(haiku):
  99. include posix_haiku
  100. else:
  101. include posix_other
  102. # There used to be this name in posix.nim a long time ago, not sure why!
  103. when StatHasNanoseconds:
  104. proc st_atime*(s: Stat): Time {.inline.} =
  105. ## Second-granularity time of last access.
  106. result = s.st_atim.tv_sec
  107. proc st_mtime*(s: Stat): Time {.inline.} =
  108. ## Second-granularity time of last data modification.
  109. result = s.st_mtim.tv_sec
  110. proc st_ctime*(s: Stat): Time {.inline.} =
  111. ## Second-granularity time of last status change.
  112. result = s.st_ctim.tv_sec
  113. else:
  114. proc st_atim*(s: Stat): Timespec {.inline.} =
  115. ## Nanosecond-granularity time of last access.
  116. result.tv_sec = s.st_atime
  117. proc st_mtim*(s: Stat): Timespec {.inline.} =
  118. ## Nanosecond-granularity time of last data modification.
  119. result.tv_sec = s.st_mtime
  120. proc st_ctim*(s: Stat): Timespec {.inline.} =
  121. ## Nanosecond-granularity time of last data modification.
  122. result.tv_sec = s.st_ctime
  123. when hasAioH:
  124. proc aio_cancel*(a1: cint, a2: ptr Taiocb): cint {.importc, header: "<aio.h>".}
  125. proc aio_error*(a1: ptr Taiocb): cint {.importc, header: "<aio.h>".}
  126. proc aio_fsync*(a1: cint, a2: ptr Taiocb): cint {.importc, header: "<aio.h>".}
  127. proc aio_read*(a1: ptr Taiocb): cint {.importc, header: "<aio.h>".}
  128. proc aio_return*(a1: ptr Taiocb): int {.importc, header: "<aio.h>".}
  129. proc aio_suspend*(a1: ptr ptr Taiocb, a2: cint, a3: ptr Timespec): cint {.
  130. importc, header: "<aio.h>".}
  131. proc aio_write*(a1: ptr Taiocb): cint {.importc, header: "<aio.h>".}
  132. proc lio_listio*(a1: cint, a2: ptr ptr Taiocb, a3: cint,
  133. a4: ptr SigEvent): cint {.importc, header: "<aio.h>".}
  134. # arpa/inet.h
  135. proc htonl*(a1: uint32): uint32 {.importc, header: "<arpa/inet.h>".}
  136. proc htons*(a1: uint16): uint16 {.importc, header: "<arpa/inet.h>".}
  137. proc ntohl*(a1: uint32): uint32 {.importc, header: "<arpa/inet.h>".}
  138. proc ntohs*(a1: uint16): uint16 {.importc, header: "<arpa/inet.h>".}
  139. when not defined(zephyr):
  140. proc inet_addr*(a1: cstring): InAddrT {.importc, header: "<arpa/inet.h>".}
  141. proc inet_ntoa*(a1: InAddr): cstring {.importc, header: "<arpa/inet.h>".}
  142. proc inet_ntop*(a1: cint, a2: pointer | ptr InAddr | ptr In6Addr, a3: cstring, a4: int32): cstring {.
  143. importc:"(char *)$1", header: "<arpa/inet.h>".}
  144. proc inet_pton*(a1: cint, a2: cstring, a3: pointer | ptr InAddr | ptr In6Addr): cint {.
  145. importc, header: "<arpa/inet.h>".}
  146. var
  147. in6addr_any* {.importc, header: "<netinet/in.h>".}: In6Addr
  148. in6addr_loopback* {.importc, header: "<netinet/in.h>".}: In6Addr
  149. proc IN6ADDR_ANY_INIT* (): In6Addr {.importc, header: "<netinet/in.h>".}
  150. proc IN6ADDR_LOOPBACK_INIT* (): In6Addr {.importc, header: "<netinet/in.h>".}
  151. # dirent.h
  152. proc closedir*(a1: ptr DIR): cint {.importc, header: "<dirent.h>".}
  153. proc opendir*(a1: cstring): ptr DIR {.importc, header: "<dirent.h>", sideEffect.}
  154. proc readdir*(a1: ptr DIR): ptr Dirent {.importc, header: "<dirent.h>", sideEffect.}
  155. proc readdir_r*(a1: ptr DIR, a2: ptr Dirent, a3: ptr ptr Dirent): cint {.
  156. importc, header: "<dirent.h>", sideEffect.}
  157. proc rewinddir*(a1: ptr DIR) {.importc, header: "<dirent.h>".}
  158. proc seekdir*(a1: ptr DIR, a2: int) {.importc, header: "<dirent.h>".}
  159. proc telldir*(a1: ptr DIR): int {.importc, header: "<dirent.h>".}
  160. # dlfcn.h
  161. proc dlclose*(a1: pointer): cint {.importc, header: "<dlfcn.h>", sideEffect.}
  162. proc dlerror*(): cstring {.importc, header: "<dlfcn.h>", sideEffect.}
  163. proc dlopen*(a1: cstring, a2: cint): pointer {.importc, header: "<dlfcn.h>", sideEffect.}
  164. proc dlsym*(a1: pointer, a2: cstring): pointer {.importc, header: "<dlfcn.h>", sideEffect.}
  165. proc creat*(a1: cstring, a2: Mode): cint {.importc, header: "<fcntl.h>", sideEffect.}
  166. proc fcntl*(a1: cint | SocketHandle, a2: cint): cint {.varargs, importc, header: "<fcntl.h>", sideEffect.}
  167. proc openImpl(a1: cstring, a2: cint): cint {.varargs, importc: "open", header: "<fcntl.h>", sideEffect.}
  168. proc open*(a1: cstring, a2: cint, mode: Mode | cint = 0.Mode): cint {.inline.} =
  169. # prevents bug #17888
  170. openImpl(a1, a2, mode)
  171. proc posix_fadvise*(a1: cint, a2, a3: Off, a4: cint): cint {.
  172. importc, header: "<fcntl.h>".}
  173. proc posix_fallocate*(a1: cint, a2, a3: Off): cint {.
  174. importc, header: "<fcntl.h>".}
  175. when not defined(haiku) and not defined(openbsd):
  176. proc fmtmsg*(a1: int, a2: cstring, a3: cint,
  177. a4, a5, a6: cstring): cint {.importc, header: "<fmtmsg.h>".}
  178. proc fnmatch*(a1, a2: cstring, a3: cint): cint {.importc, header: "<fnmatch.h>".}
  179. proc ftw*(a1: cstring,
  180. a2: proc (x1: cstring, x2: ptr Stat, x3: cint): cint {.noconv.},
  181. a3: cint): cint {.importc, header: "<ftw.h>".}
  182. when not (defined(linux) and defined(amd64)) and not defined(nintendoswitch):
  183. proc nftw*(a1: cstring,
  184. a2: proc (x1: cstring, x2: ptr Stat,
  185. x3: cint, x4: ptr FTW): cint {.noconv.},
  186. a3: cint,
  187. a4: cint): cint {.importc, header: "<ftw.h>".}
  188. proc glob*(a1: cstring, a2: cint,
  189. a3: proc (x1: cstring, x2: cint): cint {.noconv.},
  190. a4: ptr Glob): cint {.importc, header: "<glob.h>", sideEffect.}
  191. ## Filename globbing. Use `os.walkPattern() <os.html#glob_1>`_ and similar.
  192. proc globfree*(a1: ptr Glob) {.importc, header: "<glob.h>".}
  193. proc getgrgid*(a1: Gid): ptr Group {.importc, header: "<grp.h>".}
  194. proc getgrnam*(a1: cstring): ptr Group {.importc, header: "<grp.h>".}
  195. proc getgrgid_r*(a1: Gid, a2: ptr Group, a3: cstring, a4: int,
  196. a5: ptr ptr Group): cint {.importc, header: "<grp.h>".}
  197. proc getgrnam_r*(a1: cstring, a2: ptr Group, a3: cstring,
  198. a4: int, a5: ptr ptr Group): cint {.
  199. importc, header: "<grp.h>".}
  200. proc getgrent*(): ptr Group {.importc, header: "<grp.h>".}
  201. proc endgrent*() {.importc, header: "<grp.h>".}
  202. proc setgrent*() {.importc, header: "<grp.h>".}
  203. proc iconv_open*(a1, a2: cstring): Iconv {.importc, header: "<iconv.h>".}
  204. proc iconv*(a1: Iconv, a2: var cstring, a3: var int, a4: var cstring,
  205. a5: var int): int {.importc, header: "<iconv.h>".}
  206. proc iconv_close*(a1: Iconv): cint {.importc, header: "<iconv.h>".}
  207. proc nl_langinfo*(a1: Nl_item): cstring {.importc, header: "<langinfo.h>".}
  208. proc basename*(a1: cstring): cstring {.importc, header: "<libgen.h>".}
  209. proc dirname*(a1: cstring): cstring {.importc, header: "<libgen.h>".}
  210. proc localeconv*(): ptr Lconv {.importc, header: "<locale.h>".}
  211. proc setlocale*(a1: cint, a2: cstring): cstring {.
  212. importc, header: "<locale.h>", sideEffect.}
  213. proc strfmon*(a1: cstring, a2: int, a3: cstring): int {.varargs,
  214. importc, header: "<monetary.h>".}
  215. when not defined(nintendoswitch):
  216. proc mq_close*(a1: Mqd): cint {.importc, header: "<mqueue.h>".}
  217. proc mq_getattr*(a1: Mqd, a2: ptr MqAttr): cint {.
  218. importc, header: "<mqueue.h>".}
  219. proc mq_notify*(a1: Mqd, a2: ptr SigEvent): cint {.
  220. importc, header: "<mqueue.h>".}
  221. proc mq_open*(a1: cstring, a2: cint): Mqd {.
  222. varargs, importc, header: "<mqueue.h>".}
  223. proc mq_receive*(a1: Mqd, a2: cstring, a3: int, a4: var int): int {.
  224. importc, header: "<mqueue.h>".}
  225. proc mq_send*(a1: Mqd, a2: cstring, a3: int, a4: int): cint {.
  226. importc, header: "<mqueue.h>".}
  227. proc mq_setattr*(a1: Mqd, a2, a3: ptr MqAttr): cint {.
  228. importc, header: "<mqueue.h>".}
  229. proc mq_timedreceive*(a1: Mqd, a2: cstring, a3: int, a4: int,
  230. a5: ptr Timespec): int {.importc, header: "<mqueue.h>".}
  231. proc mq_timedsend*(a1: Mqd, a2: cstring, a3: int, a4: int,
  232. a5: ptr Timespec): cint {.importc, header: "<mqueue.h>".}
  233. proc mq_unlink*(a1: cstring): cint {.importc, header: "<mqueue.h>".}
  234. proc getpwnam*(a1: cstring): ptr Passwd {.importc, header: "<pwd.h>".}
  235. proc getpwuid*(a1: Uid): ptr Passwd {.importc, header: "<pwd.h>".}
  236. proc getpwnam_r*(a1: cstring, a2: ptr Passwd, a3: cstring, a4: int,
  237. a5: ptr ptr Passwd): cint {.importc, header: "<pwd.h>".}
  238. proc getpwuid_r*(a1: Uid, a2: ptr Passwd, a3: cstring,
  239. a4: int, a5: ptr ptr Passwd): cint {.importc, header: "<pwd.h>".}
  240. proc endpwent*() {.importc, header: "<pwd.h>".}
  241. proc getpwent*(): ptr Passwd {.importc, header: "<pwd.h>".}
  242. proc setpwent*() {.importc, header: "<pwd.h>".}
  243. proc uname*(a1: var Utsname): cint {.importc, header: "<sys/utsname.h>".}
  244. proc strerror*(errnum: cint): cstring {.importc, header: "<string.h>".}
  245. proc pthread_atfork*(a1, a2, a3: proc () {.noconv.}): cint {.
  246. importc, header: "<pthread.h>".}
  247. proc pthread_attr_destroy*(a1: ptr Pthread_attr): cint {.
  248. importc, header: "<pthread.h>".}
  249. proc pthread_attr_getdetachstate*(a1: ptr Pthread_attr, a2: cint): cint {.
  250. importc, header: "<pthread.h>".}
  251. proc pthread_attr_getguardsize*(a1: ptr Pthread_attr, a2: var cint): cint {.
  252. importc, header: "<pthread.h>".}
  253. proc pthread_attr_getinheritsched*(a1: ptr Pthread_attr,
  254. a2: var cint): cint {.importc, header: "<pthread.h>".}
  255. proc pthread_attr_getschedparam*(a1: ptr Pthread_attr,
  256. a2: ptr Sched_param): cint {.importc, header: "<pthread.h>".}
  257. proc pthread_attr_getschedpolicy*(a1: ptr Pthread_attr,
  258. a2: var cint): cint {.importc, header: "<pthread.h>".}
  259. proc pthread_attr_getscope*(a1: ptr Pthread_attr,
  260. a2: var cint): cint {.importc, header: "<pthread.h>".}
  261. proc pthread_attr_getstack*(a1: ptr Pthread_attr,
  262. a2: var pointer, a3: var int): cint {.importc, header: "<pthread.h>".}
  263. proc pthread_attr_getstackaddr*(a1: ptr Pthread_attr,
  264. a2: var pointer): cint {.importc, header: "<pthread.h>".}
  265. proc pthread_attr_getstacksize*(a1: ptr Pthread_attr,
  266. a2: var int): cint {.importc, header: "<pthread.h>".}
  267. proc pthread_attr_init*(a1: ptr Pthread_attr): cint {.
  268. importc, header: "<pthread.h>".}
  269. proc pthread_attr_setdetachstate*(a1: ptr Pthread_attr, a2: cint): cint {.
  270. importc, header: "<pthread.h>".}
  271. proc pthread_attr_setguardsize*(a1: ptr Pthread_attr, a2: int): cint {.
  272. importc, header: "<pthread.h>".}
  273. proc pthread_attr_setinheritsched*(a1: ptr Pthread_attr, a2: cint): cint {.
  274. importc, header: "<pthread.h>".}
  275. proc pthread_attr_setschedparam*(a1: ptr Pthread_attr,
  276. a2: ptr Sched_param): cint {.importc, header: "<pthread.h>".}
  277. proc pthread_attr_setschedpolicy*(a1: ptr Pthread_attr, a2: cint): cint {.
  278. importc, header: "<pthread.h>".}
  279. proc pthread_attr_setscope*(a1: ptr Pthread_attr, a2: cint): cint {.importc,
  280. header: "<pthread.h>".}
  281. proc pthread_attr_setstack*(a1: ptr Pthread_attr, a2: pointer, a3: int): cint {.
  282. importc, header: "<pthread.h>".}
  283. proc pthread_attr_setstackaddr*(a1: ptr Pthread_attr, a2: pointer): cint {.
  284. importc, header: "<pthread.h>".}
  285. proc pthread_attr_setstacksize*(a1: ptr Pthread_attr, a2: int): cint {.
  286. importc, header: "<pthread.h>".}
  287. proc pthread_barrier_destroy*(a1: ptr Pthread_barrier): cint {.
  288. importc, header: "<pthread.h>".}
  289. proc pthread_barrier_init*(a1: ptr Pthread_barrier,
  290. a2: ptr Pthread_barrierattr, a3: cint): cint {.
  291. importc, header: "<pthread.h>".}
  292. proc pthread_barrier_wait*(a1: ptr Pthread_barrier): cint {.
  293. importc, header: "<pthread.h>".}
  294. proc pthread_barrierattr_destroy*(a1: ptr Pthread_barrierattr): cint {.
  295. importc, header: "<pthread.h>".}
  296. proc pthread_barrierattr_getpshared*(
  297. a1: ptr Pthread_barrierattr, a2: var cint): cint {.
  298. importc, header: "<pthread.h>".}
  299. proc pthread_barrierattr_init*(a1: ptr Pthread_barrierattr): cint {.
  300. importc, header: "<pthread.h>".}
  301. proc pthread_barrierattr_setpshared*(a1: ptr Pthread_barrierattr,
  302. a2: cint): cint {.importc, header: "<pthread.h>".}
  303. proc pthread_cancel*(a1: Pthread): cint {.importc, header: "<pthread.h>".}
  304. proc pthread_cleanup_push*(a1: proc (x: pointer) {.noconv.}, a2: pointer) {.
  305. importc, header: "<pthread.h>".}
  306. proc pthread_cleanup_pop*(a1: cint) {.importc, header: "<pthread.h>".}
  307. proc pthread_cond_broadcast*(a1: ptr Pthread_cond): cint {.
  308. importc, header: "<pthread.h>".}
  309. proc pthread_cond_destroy*(a1: ptr Pthread_cond): cint {.importc, header: "<pthread.h>".}
  310. proc pthread_cond_init*(a1: ptr Pthread_cond,
  311. a2: ptr Pthread_condattr): cint {.importc, header: "<pthread.h>".}
  312. proc pthread_cond_signal*(a1: ptr Pthread_cond): cint {.importc, header: "<pthread.h>".}
  313. proc pthread_cond_timedwait*(a1: ptr Pthread_cond,
  314. a2: ptr Pthread_mutex, a3: ptr Timespec): cint {.importc, header: "<pthread.h>".}
  315. proc pthread_cond_wait*(a1: ptr Pthread_cond,
  316. a2: ptr Pthread_mutex): cint {.importc, header: "<pthread.h>".}
  317. proc pthread_condattr_destroy*(a1: ptr Pthread_condattr): cint {.importc, header: "<pthread.h>".}
  318. proc pthread_condattr_getclock*(a1: ptr Pthread_condattr,
  319. a2: var ClockId): cint {.importc, header: "<pthread.h>".}
  320. proc pthread_condattr_getpshared*(a1: ptr Pthread_condattr,
  321. a2: var cint): cint {.importc, header: "<pthread.h>".}
  322. proc pthread_condattr_init*(a1: ptr Pthread_condattr): cint {.importc, header: "<pthread.h>".}
  323. proc pthread_condattr_setclock*(a1: ptr Pthread_condattr,a2: ClockId): cint {.importc, header: "<pthread.h>".}
  324. proc pthread_condattr_setpshared*(a1: ptr Pthread_condattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  325. proc pthread_create*(a1: ptr Pthread, a2: ptr Pthread_attr,
  326. a3: proc (x: pointer): pointer {.noconv.}, a4: pointer): cint {.importc, header: "<pthread.h>".}
  327. proc pthread_detach*(a1: Pthread): cint {.importc, header: "<pthread.h>".}
  328. proc pthread_equal*(a1, a2: Pthread): cint {.importc, header: "<pthread.h>".}
  329. proc pthread_exit*(a1: pointer) {.importc, header: "<pthread.h>".}
  330. proc pthread_getconcurrency*(): cint {.importc, header: "<pthread.h>".}
  331. proc pthread_getcpuclockid*(a1: Pthread, a2: var ClockId): cint {.importc, header: "<pthread.h>".}
  332. proc pthread_getschedparam*(a1: Pthread, a2: var cint,
  333. a3: ptr Sched_param): cint {.importc, header: "<pthread.h>".}
  334. proc pthread_getspecific*(a1: Pthread_key): pointer {.importc, header: "<pthread.h>".}
  335. proc pthread_join*(a1: Pthread, a2: ptr pointer): cint {.importc, header: "<pthread.h>".}
  336. proc pthread_key_create*(a1: ptr Pthread_key, a2: proc (x: pointer) {.noconv.}): cint {.importc, header: "<pthread.h>".}
  337. proc pthread_key_delete*(a1: Pthread_key): cint {.importc, header: "<pthread.h>".}
  338. proc pthread_mutex_destroy*(a1: ptr Pthread_mutex): cint {.importc, header: "<pthread.h>".}
  339. proc pthread_mutex_getprioceiling*(a1: ptr Pthread_mutex,
  340. a2: var cint): cint {.importc, header: "<pthread.h>".}
  341. proc pthread_mutex_init*(a1: ptr Pthread_mutex,
  342. a2: ptr Pthread_mutexattr): cint {.importc, header: "<pthread.h>".}
  343. proc pthread_mutex_lock*(a1: ptr Pthread_mutex): cint {.importc, header: "<pthread.h>".}
  344. proc pthread_mutex_setprioceiling*(a1: ptr Pthread_mutex,a2: cint,
  345. a3: var cint): cint {.importc, header: "<pthread.h>".}
  346. proc pthread_mutex_timedlock*(a1: ptr Pthread_mutex,
  347. a2: ptr Timespec): cint {.importc, header: "<pthread.h>".}
  348. proc pthread_mutex_trylock*(a1: ptr Pthread_mutex): cint {.importc, header: "<pthread.h>".}
  349. proc pthread_mutex_unlock*(a1: ptr Pthread_mutex): cint {.importc, header: "<pthread.h>".}
  350. proc pthread_mutexattr_destroy*(a1: ptr Pthread_mutexattr): cint {.importc, header: "<pthread.h>".}
  351. proc pthread_mutexattr_getprioceiling*(
  352. a1: ptr Pthread_mutexattr, a2: var cint): cint {.importc, header: "<pthread.h>".}
  353. proc pthread_mutexattr_getprotocol*(a1: ptr Pthread_mutexattr,
  354. a2: var cint): cint {.importc, header: "<pthread.h>".}
  355. proc pthread_mutexattr_getpshared*(a1: ptr Pthread_mutexattr,
  356. a2: var cint): cint {.importc, header: "<pthread.h>".}
  357. proc pthread_mutexattr_gettype*(a1: ptr Pthread_mutexattr,
  358. a2: var cint): cint {.importc, header: "<pthread.h>".}
  359. proc pthread_mutexattr_init*(a1: ptr Pthread_mutexattr): cint {.importc, header: "<pthread.h>".}
  360. proc pthread_mutexattr_setprioceiling*(a1: ptr Pthread_mutexattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  361. proc pthread_mutexattr_setprotocol*(a1: ptr Pthread_mutexattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  362. proc pthread_mutexattr_setpshared*(a1: ptr Pthread_mutexattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  363. proc pthread_mutexattr_settype*(a1: ptr Pthread_mutexattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  364. proc pthread_once*(a1: ptr Pthread_once, a2: proc () {.noconv.}): cint {.importc, header: "<pthread.h>".}
  365. proc pthread_rwlock_destroy*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  366. proc pthread_rwlock_init*(a1: ptr Pthread_rwlock,
  367. a2: ptr Pthread_rwlockattr): cint {.importc, header: "<pthread.h>".}
  368. proc pthread_rwlock_rdlock*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  369. proc pthread_rwlock_timedrdlock*(a1: ptr Pthread_rwlock,
  370. a2: ptr Timespec): cint {.importc, header: "<pthread.h>".}
  371. proc pthread_rwlock_timedwrlock*(a1: ptr Pthread_rwlock,
  372. a2: ptr Timespec): cint {.importc, header: "<pthread.h>".}
  373. proc pthread_rwlock_tryrdlock*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  374. proc pthread_rwlock_trywrlock*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  375. proc pthread_rwlock_unlock*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  376. proc pthread_rwlock_wrlock*(a1: ptr Pthread_rwlock): cint {.importc, header: "<pthread.h>".}
  377. proc pthread_rwlockattr_destroy*(a1: ptr Pthread_rwlockattr): cint {.importc, header: "<pthread.h>".}
  378. proc pthread_rwlockattr_getpshared*(
  379. a1: ptr Pthread_rwlockattr, a2: var cint): cint {.importc, header: "<pthread.h>".}
  380. proc pthread_rwlockattr_init*(a1: ptr Pthread_rwlockattr): cint {.importc, header: "<pthread.h>".}
  381. proc pthread_rwlockattr_setpshared*(a1: ptr Pthread_rwlockattr, a2: cint): cint {.importc, header: "<pthread.h>".}
  382. proc pthread_self*(): Pthread {.importc, header: "<pthread.h>".}
  383. proc pthread_setcancelstate*(a1: cint, a2: var cint): cint {.importc, header: "<pthread.h>".}
  384. proc pthread_setcanceltype*(a1: cint, a2: var cint): cint {.importc, header: "<pthread.h>".}
  385. proc pthread_setconcurrency*(a1: cint): cint {.importc, header: "<pthread.h>".}
  386. proc pthread_setschedparam*(a1: Pthread, a2: cint,
  387. a3: ptr Sched_param): cint {.importc, header: "<pthread.h>".}
  388. proc pthread_setschedprio*(a1: Pthread, a2: cint): cint {.
  389. importc, header: "<pthread.h>".}
  390. proc pthread_setspecific*(a1: Pthread_key, a2: pointer): cint {.
  391. importc, header: "<pthread.h>".}
  392. proc pthread_spin_destroy*(a1: ptr Pthread_spinlock): cint {.
  393. importc, header: "<pthread.h>".}
  394. proc pthread_spin_init*(a1: ptr Pthread_spinlock, a2: cint): cint {.
  395. importc, header: "<pthread.h>".}
  396. proc pthread_spin_lock*(a1: ptr Pthread_spinlock): cint {.
  397. importc, header: "<pthread.h>".}
  398. proc pthread_spin_trylock*(a1: ptr Pthread_spinlock): cint{.
  399. importc, header: "<pthread.h>".}
  400. proc pthread_spin_unlock*(a1: ptr Pthread_spinlock): cint {.
  401. importc, header: "<pthread.h>".}
  402. proc pthread_testcancel*() {.importc, header: "<pthread.h>".}
  403. proc exitnow*(code: int) {.importc: "_exit", header: "<unistd.h>".}
  404. proc access*(a1: cstring, a2: cint): cint {.importc, header: "<unistd.h>".}
  405. proc alarm*(a1: cint): cint {.importc, header: "<unistd.h>".}
  406. proc chdir*(a1: cstring): cint {.importc, header: "<unistd.h>".}
  407. proc chown*(a1: cstring, a2: Uid, a3: Gid): cint {.importc, header: "<unistd.h>".}
  408. proc close*(a1: cint | SocketHandle): cint {.importc, header: "<unistd.h>".}
  409. proc confstr*(a1: cint, a2: cstring, a3: int): int {.importc, header: "<unistd.h>".}
  410. proc crypt*(a1, a2: cstring): cstring {.importc, header: "<unistd.h>".}
  411. proc ctermid*(a1: cstring): cstring {.importc, header: "<unistd.h>".}
  412. proc dup*(a1: cint): cint {.importc, header: "<unistd.h>".}
  413. proc dup2*(a1, a2: cint): cint {.importc, header: "<unistd.h>".}
  414. proc encrypt*(a1: array[0..63, char], a2: cint) {.importc, header: "<unistd.h>".}
  415. proc execl*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>", sideEffect.}
  416. proc execle*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>", sideEffect.}
  417. proc execlp*(a1, a2: cstring): cint {.varargs, importc, header: "<unistd.h>", sideEffect.}
  418. proc execv*(a1: cstring, a2: cstringArray): cint {.importc, header: "<unistd.h>", sideEffect.}
  419. proc execve*(a1: cstring, a2, a3: cstringArray): cint {.
  420. importc, header: "<unistd.h>", sideEffect.}
  421. proc execvp*(a1: cstring, a2: cstringArray): cint {.importc, header: "<unistd.h>", sideEffect.}
  422. proc execvpe*(a1: cstring, a2: cstringArray, a3: cstringArray): cint {.importc, header: "<unistd.h>", sideEffect.}
  423. proc fchown*(a1: cint, a2: Uid, a3: Gid): cint {.importc, header: "<unistd.h>", sideEffect.}
  424. proc fchdir*(a1: cint): cint {.importc, header: "<unistd.h>", sideEffect.}
  425. proc fdatasync*(a1: cint): cint {.importc, header: "<unistd.h>".}
  426. proc fork*(): Pid {.importc, header: "<unistd.h>", sideEffect.}
  427. proc fpathconf*(a1, a2: cint): int {.importc, header: "<unistd.h>".}
  428. proc fsync*(a1: cint): cint {.importc, header: "<unistd.h>".}
  429. ## synchronize a file's buffer cache to the storage device
  430. proc ftruncate*(a1: cint, a2: Off): cint {.importc, header: "<unistd.h>".}
  431. proc getcwd*(a1: cstring, a2: int): cstring {.importc, header: "<unistd.h>", sideEffect.}
  432. proc getuid*(): Uid {.importc, header: "<unistd.h>", sideEffect.}
  433. ## returns the real user ID of the calling process
  434. proc geteuid*(): Uid {.importc, header: "<unistd.h>", sideEffect.}
  435. ## returns the effective user ID of the calling process
  436. proc getgid*(): Gid {.importc, header: "<unistd.h>", sideEffect.}
  437. ## returns the real group ID of the calling process
  438. proc getegid*(): Gid {.importc, header: "<unistd.h>", sideEffect.}
  439. ## returns the effective group ID of the calling process
  440. proc getgroups*(a1: cint, a2: ptr array[0..255, Gid]): cint {.
  441. importc, header: "<unistd.h>".}
  442. proc gethostid*(): int {.importc, header: "<unistd.h>", sideEffect.}
  443. proc gethostname*(a1: cstring, a2: int): cint {.importc, header: "<unistd.h>", sideEffect.}
  444. proc getlogin*(): cstring {.importc, header: "<unistd.h>", sideEffect.}
  445. proc getlogin_r*(a1: cstring, a2: int): cint {.importc, header: "<unistd.h>", sideEffect.}
  446. proc getopt*(a1: cint, a2: cstringArray, a3: cstring): cint {.
  447. importc, header: "<unistd.h>".}
  448. proc getpgid*(a1: Pid): Pid {.importc, header: "<unistd.h>".}
  449. proc getpgrp*(): Pid {.importc, header: "<unistd.h>".}
  450. proc getpid*(): Pid {.importc, header: "<unistd.h>", sideEffect.}
  451. ## returns the process ID (PID) of the calling process
  452. proc getppid*(): Pid {.importc, header: "<unistd.h>", sideEffect.}
  453. ## returns the process ID of the parent of the calling process
  454. proc getsid*(a1: Pid): Pid {.importc, header: "<unistd.h>", sideEffect.}
  455. ## returns the session ID of the calling process
  456. proc getwd*(a1: cstring): cstring {.importc, header: "<unistd.h>".}
  457. proc isatty*(a1: cint): cint {.importc, header: "<unistd.h>".}
  458. proc lchown*(a1: cstring, a2: Uid, a3: Gid): cint {.importc, header: "<unistd.h>".}
  459. proc link*(a1, a2: cstring): cint {.importc, header: "<unistd.h>".}
  460. proc lockf*(a1, a2: cint, a3: Off): cint {.importc, header: "<unistd.h>".}
  461. proc lseek*(a1: cint, a2: Off, a3: cint): Off {.importc, header: "<unistd.h>".}
  462. proc nice*(a1: cint): cint {.importc, header: "<unistd.h>".}
  463. proc pathconf*(a1: cstring, a2: cint): int {.importc, header: "<unistd.h>".}
  464. proc pause*(): cint {.importc, header: "<unistd.h>".}
  465. proc pclose*(a: File): cint {.importc, header: "<stdio.h>".}
  466. proc pipe*(a: array[0..1, cint]): cint {.importc, header: "<unistd.h>".}
  467. proc popen*(a1, a2: cstring): File {.importc, header: "<stdio.h>".}
  468. proc pread*(a1: cint, a2: pointer, a3: int, a4: Off): int {.
  469. importc, header: "<unistd.h>".}
  470. proc pwrite*(a1: cint, a2: pointer, a3: int, a4: Off): int {.
  471. importc, header: "<unistd.h>".}
  472. proc read*(a1: cint, a2: pointer, a3: int): int {.importc, header: "<unistd.h>".}
  473. proc readlink*(a1, a2: cstring, a3: int): int {.importc, header: "<unistd.h>".}
  474. proc ioctl*(f: FileHandle, device: uint): int {.importc: "ioctl",
  475. header: "<sys/ioctl.h>", varargs, tags: [WriteIOEffect].}
  476. ## A system call for device-specific input/output operations and other
  477. ## operations which cannot be expressed by regular system calls
  478. proc rmdir*(a1: cstring): cint {.importc, header: "<unistd.h>".}
  479. proc setegid*(a1: Gid): cint {.importc, header: "<unistd.h>".}
  480. proc seteuid*(a1: Uid): cint {.importc, header: "<unistd.h>".}
  481. proc setgid*(a1: Gid): cint {.importc, header: "<unistd.h>".}
  482. proc setpgid*(a1, a2: Pid): cint {.importc, header: "<unistd.h>".}
  483. proc setpgrp*(): Pid {.importc, header: "<unistd.h>".}
  484. proc setregid*(a1, a2: Gid): cint {.importc, header: "<unistd.h>".}
  485. proc setreuid*(a1, a2: Uid): cint {.importc, header: "<unistd.h>".}
  486. proc setsid*(): Pid {.importc, header: "<unistd.h>".}
  487. proc setuid*(a1: Uid): cint {.importc, header: "<unistd.h>".}
  488. proc sleep*(a1: cint): cint {.importc, header: "<unistd.h>".}
  489. proc swab*(a1, a2: pointer, a3: int) {.importc, header: "<unistd.h>".}
  490. proc symlink*(a1, a2: cstring): cint {.importc, header: "<unistd.h>".}
  491. proc sync*() {.importc, header: "<unistd.h>".}
  492. proc sysconf*(a1: cint): int {.importc, header: "<unistd.h>".}
  493. proc tcgetpgrp*(a1: cint): Pid {.importc, header: "<unistd.h>".}
  494. proc tcsetpgrp*(a1: cint, a2: Pid): cint {.importc, header: "<unistd.h>".}
  495. proc truncate*(a1: cstring, a2: Off): cint {.importc, header: "<unistd.h>".}
  496. proc ttyname*(a1: cint): cstring {.importc, header: "<unistd.h>".}
  497. proc ttyname_r*(a1: cint, a2: cstring, a3: int): cint {.
  498. importc, header: "<unistd.h>".}
  499. proc ualarm*(a1, a2: Useconds): Useconds {.importc, header: "<unistd.h>".}
  500. proc unlink*(a1: cstring): cint {.importc, header: "<unistd.h>".}
  501. proc usleep*(a1: Useconds): cint {.importc, header: "<unistd.h>".}
  502. proc vfork*(): Pid {.importc, header: "<unistd.h>".}
  503. proc write*(a1: cint, a2: pointer, a3: int): int {.importc, header: "<unistd.h>".}
  504. proc sem_close*(a1: ptr Sem): cint {.importc, header: "<semaphore.h>".}
  505. proc sem_destroy*(a1: ptr Sem): cint {.importc, header: "<semaphore.h>".}
  506. proc sem_getvalue*(a1: ptr Sem, a2: var cint): cint {.
  507. importc, header: "<semaphore.h>".}
  508. proc sem_init*(a1: ptr Sem, a2: cint, a3: cint): cint {.
  509. importc, header: "<semaphore.h>".}
  510. proc sem_open*(a1: cstring, a2: cint): ptr Sem {.
  511. varargs, importc, header: "<semaphore.h>".}
  512. proc sem_post*(a1: ptr Sem): cint {.importc, header: "<semaphore.h>".}
  513. proc sem_timedwait*(a1: ptr Sem, a2: ptr Timespec): cint {.
  514. importc, header: "<semaphore.h>".}
  515. proc sem_trywait*(a1: ptr Sem): cint {.importc, header: "<semaphore.h>".}
  516. proc sem_unlink*(a1: cstring): cint {.importc, header: "<semaphore.h>".}
  517. proc sem_wait*(a1: ptr Sem): cint {.importc, header: "<semaphore.h>".}
  518. proc ftok*(a1: cstring, a2: cint): Key {.importc, header: "<sys/ipc.h>".}
  519. proc statvfs*(a1: cstring, a2: var Statvfs): cint {.
  520. importc, header: "<sys/statvfs.h>".}
  521. proc fstatvfs*(a1: cint, a2: var Statvfs): cint {.
  522. importc, header: "<sys/statvfs.h>".}
  523. proc chmod*(a1: cstring, a2: Mode): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  524. when defined(osx) or defined(freebsd):
  525. proc lchmod*(a1: cstring, a2: Mode): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  526. proc fchmod*(a1: cint, a2: Mode): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  527. proc fstat*(a1: cint, a2: var Stat): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  528. proc lstat*(a1: cstring, a2: var Stat): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  529. proc mkdir*(a1: cstring, a2: Mode): cint {.importc, header: "<sys/stat.h>", sideEffect.}
  530. ## Use `os.createDir() <os.html#createDir,string>`_ and similar.
  531. proc mkfifo*(a1: cstring, a2: Mode): cint {.importc, header: "<sys/stat.h>".}
  532. proc mknod*(a1: cstring, a2: Mode, a3: Dev): cint {.
  533. importc, header: "<sys/stat.h>".}
  534. proc stat*(a1: cstring, a2: var Stat): cint {.importc, header: "<sys/stat.h>".}
  535. proc umask*(a1: Mode): Mode {.importc, header: "<sys/stat.h>".}
  536. proc S_ISBLK*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  537. ## Test for a block special file.
  538. proc S_ISCHR*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  539. ## Test for a character special file.
  540. proc S_ISDIR*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  541. ## Test for a directory.
  542. proc S_ISFIFO*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  543. ## Test for a pipe or FIFO special file.
  544. proc S_ISREG*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  545. ## Test for a regular file.
  546. proc S_ISLNK*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  547. ## Test for a symbolic link.
  548. proc S_ISSOCK*(m: Mode): bool {.importc, header: "<sys/stat.h>".}
  549. ## Test for a socket.
  550. proc S_TYPEISMQ*(buf: var Stat): bool {.importc, header: "<sys/stat.h>".}
  551. ## Test for a message queue.
  552. proc S_TYPEISSEM*(buf: var Stat): bool {.importc, header: "<sys/stat.h>".}
  553. ## Test for a semaphore.
  554. proc S_TYPEISSHM*(buf: var Stat): bool {.importc, header: "<sys/stat.h>".}
  555. ## Test for a shared memory object.
  556. proc S_TYPEISTMO*(buf: var Stat): bool {.importc, header: "<sys/stat.h>".}
  557. ## Test macro for a typed memory object.
  558. proc mlock*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".}
  559. proc mlockall*(a1: cint): cint {.importc, header: "<sys/mman.h>".}
  560. proc mmap*(a1: pointer, a2: int, a3, a4, a5: cint, a6: Off): pointer {.
  561. importc, header: "<sys/mman.h>".}
  562. proc mprotect*(a1: pointer, a2: int, a3: cint): cint {.
  563. importc, header: "<sys/mman.h>".}
  564. proc msync*(a1: pointer, a2: int, a3: cint): cint {.importc, header: "<sys/mman.h>".}
  565. proc munlock*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".}
  566. proc munlockall*(): cint {.importc, header: "<sys/mman.h>".}
  567. proc munmap*(a1: pointer, a2: int): cint {.importc, header: "<sys/mman.h>".}
  568. proc posix_madvise*(a1: pointer, a2: int, a3: cint): cint {.
  569. importc, header: "<sys/mman.h>".}
  570. proc posix_mem_offset*(a1: pointer, a2: int, a3: var Off,
  571. a4: var int, a5: var cint): cint {.importc, header: "<sys/mman.h>".}
  572. when not (defined(linux) and defined(amd64)) and not defined(nintendoswitch) and
  573. not defined(haiku):
  574. proc posix_typed_mem_get_info*(a1: cint,
  575. a2: var Posix_typed_mem_info): cint {.importc, header: "<sys/mman.h>".}
  576. proc posix_typed_mem_open*(a1: cstring, a2, a3: cint): cint {.
  577. importc, header: "<sys/mman.h>".}
  578. proc shm_open*(a1: cstring, a2: cint, a3: Mode): cint {.
  579. importc, header: "<sys/mman.h>".}
  580. proc shm_unlink*(a1: cstring): cint {.importc, header: "<sys/mman.h>".}
  581. proc asctime*(a1: var Tm): cstring{.importc, header: "<time.h>".}
  582. proc asctime_r*(a1: var Tm, a2: cstring): cstring {.importc, header: "<time.h>".}
  583. proc clock*(): Clock {.importc, header: "<time.h>", sideEffect.}
  584. proc clock_getcpuclockid*(a1: Pid, a2: var ClockId): cint {.
  585. importc, header: "<time.h>", sideEffect.}
  586. proc clock_getres*(a1: ClockId, a2: var Timespec): cint {.
  587. importc, header: "<time.h>", sideEffect.}
  588. proc clock_gettime*(a1: ClockId, a2: var Timespec): cint {.
  589. importc, header: "<time.h>", sideEffect.}
  590. proc clock_nanosleep*(a1: ClockId, a2: cint, a3: var Timespec,
  591. a4: var Timespec): cint {.importc, header: "<time.h>", sideEffect.}
  592. proc clock_settime*(a1: ClockId, a2: var Timespec): cint {.
  593. importc, header: "<time.h>", sideEffect.}
  594. proc `==`*(a, b: Time): bool {.borrow.}
  595. proc `-`*(a, b: Time): Time {.borrow.}
  596. proc ctime*(a1: var Time): cstring {.importc, header: "<time.h>".}
  597. proc ctime_r*(a1: var Time, a2: cstring): cstring {.importc, header: "<time.h>".}
  598. proc difftime*(a1, a2: Time): cdouble {.importc, header: "<time.h>".}
  599. proc getdate*(a1: cstring): ptr Tm {.importc, header: "<time.h>".}
  600. proc gmtime*(a1: var Time): ptr Tm {.importc, header: "<time.h>".}
  601. proc gmtime_r*(a1: var Time, a2: var Tm): ptr Tm {.importc, header: "<time.h>".}
  602. proc localtime*(a1: var Time): ptr Tm {.importc, header: "<time.h>".}
  603. proc localtime_r*(a1: var Time, a2: var Tm): ptr Tm {.importc, header: "<time.h>".}
  604. proc mktime*(a1: var Tm): Time {.importc, header: "<time.h>".}
  605. proc timegm*(a1: var Tm): Time {.importc, header: "<time.h>".}
  606. proc nanosleep*(a1, a2: var Timespec): cint {.importc, header: "<time.h>", sideEffect.}
  607. proc strftime*(a1: cstring, a2: int, a3: cstring,
  608. a4: var Tm): int {.importc, header: "<time.h>".}
  609. proc strptime*(a1, a2: cstring, a3: var Tm): cstring {.importc, header: "<time.h>".}
  610. proc time*(a1: var Time): Time {.importc, header: "<time.h>", sideEffect.}
  611. proc timer_create*(a1: ClockId, a2: var SigEvent,
  612. a3: var Timer): cint {.importc, header: "<time.h>".}
  613. proc timer_delete*(a1: Timer): cint {.importc, header: "<time.h>".}
  614. proc timer_gettime*(a1: Timer, a2: var Itimerspec): cint {.
  615. importc, header: "<time.h>".}
  616. proc timer_getoverrun*(a1: Timer): cint {.importc, header: "<time.h>".}
  617. proc timer_settime*(a1: Timer, a2: cint, a3: var Itimerspec,
  618. a4: var Itimerspec): cint {.importc, header: "<time.h>".}
  619. proc tzset*() {.importc, header: "<time.h>".}
  620. proc wait*(a1: ptr cint): Pid {.importc, discardable, header: "<sys/wait.h>", sideEffect.}
  621. proc waitid*(a1: cint, a2: Id, a3: var SigInfo, a4: cint): cint {.
  622. importc, header: "<sys/wait.h>", sideEffect.}
  623. proc waitpid*(a1: Pid, a2: var cint, a3: cint): Pid {.
  624. importc, header: "<sys/wait.h>", sideEffect.}
  625. type Rusage* {.importc: "struct rusage", header: "<sys/resource.h>",
  626. bycopy.} = object
  627. ru_utime*, ru_stime*: Timeval # User and system time
  628. ru_maxrss*, ru_ixrss*, ru_idrss*, ru_isrss*, # memory sizes
  629. ru_minflt*, ru_majflt*, ru_nswap*, # paging activity
  630. ru_inblock*, ru_oublock*, ru_msgsnd*, ru_msgrcv*, # IO activity
  631. ru_nsignals*, ru_nvcsw*, ru_nivcsw*: clong # switching activity
  632. proc wait4*(pid: Pid, status: ptr cint, options: cint, rusage: ptr Rusage): Pid
  633. {.importc, header: "<sys/wait.h>", sideEffect.}
  634. const
  635. RUSAGE_SELF* = cint(0)
  636. RUSAGE_CHILDREN* = cint(-1)
  637. RUSAGE_THREAD* = cint(1) # This one is less std; Linux, BSD agree though.
  638. # This can only fail if `who` is invalid or `rusage` ptr is invalid.
  639. proc getrusage*(who: cint, rusage: ptr Rusage): cint
  640. {.importc, header: "<sys/resource.h>", discardable.}
  641. proc bsd_signal*(a1: cint, a2: proc (x: pointer) {.noconv.}) {.
  642. importc, header: "<signal.h>".}
  643. proc kill*(a1: Pid, a2: cint): cint {.importc, header: "<signal.h>", sideEffect.}
  644. proc killpg*(a1: Pid, a2: cint): cint {.importc, header: "<signal.h>", sideEffect.}
  645. proc pthread_kill*(a1: Pthread, a2: cint): cint {.importc, header: "<signal.h>".}
  646. proc pthread_sigmask*(a1: cint, a2, a3: var Sigset): cint {.
  647. importc, header: "<signal.h>".}
  648. proc `raise`*(a1: cint): cint {.importc, header: "<signal.h>".}
  649. proc sigaction*(a1: cint, a2, a3: var Sigaction): cint {.
  650. importc, header: "<signal.h>".}
  651. proc sigaction*(a1: cint, a2: var Sigaction; a3: ptr Sigaction = nil): cint {.
  652. importc, header: "<signal.h>".}
  653. proc sigaddset*(a1: var Sigset, a2: cint): cint {.importc, header: "<signal.h>".}
  654. proc sigaltstack*(a1, a2: var Stack): cint {.importc, header: "<signal.h>".}
  655. proc sigdelset*(a1: var Sigset, a2: cint): cint {.importc, header: "<signal.h>".}
  656. proc sigemptyset*(a1: var Sigset): cint {.importc, header: "<signal.h>".}
  657. proc sigfillset*(a1: var Sigset): cint {.importc, header: "<signal.h>".}
  658. proc sighold*(a1: cint): cint {.importc, header: "<signal.h>".}
  659. proc sigignore*(a1: cint): cint {.importc, header: "<signal.h>".}
  660. proc siginterrupt*(a1, a2: cint): cint {.importc, header: "<signal.h>".}
  661. proc sigismember*(a1: var Sigset, a2: cint): cint {.importc, header: "<signal.h>".}
  662. proc signal*(a1: cint, a2: Sighandler) {.
  663. importc, header: "<signal.h>".}
  664. proc sigpause*(a1: cint): cint {.importc, header: "<signal.h>".}
  665. proc sigpending*(a1: var Sigset): cint {.importc, header: "<signal.h>".}
  666. proc sigprocmask*(a1: cint, a2, a3: var Sigset): cint {.
  667. importc, header: "<signal.h>".}
  668. proc sigqueue*(a1: Pid, a2: cint, a3: SigVal): cint {.
  669. importc, header: "<signal.h>".}
  670. proc sigrelse*(a1: cint): cint {.importc, header: "<signal.h>".}
  671. proc sigset*(a1: int, a2: proc (x: cint) {.noconv.}) {.
  672. importc, header: "<signal.h>".}
  673. proc sigsuspend*(a1: var Sigset): cint {.importc, header: "<signal.h>".}
  674. when defined(android):
  675. proc syscall(arg: clong): clong {.varargs, importc: "syscall", header: "<unistd.h>".}
  676. var NR_rt_sigtimedwait {.importc: "__NR_rt_sigtimedwait", header: "<sys/syscall.h>".}: clong
  677. var NSIGMAX {.importc: "NSIG", header: "<signal.h>".}: clong
  678. proc sigtimedwait*(a1: var Sigset, a2: var SigInfo, a3: var Timespec): cint =
  679. result = cint(syscall(NR_rt_sigtimedwait, addr(a1), addr(a2), addr(a3), NSIGMAX div 8))
  680. else:
  681. proc sigtimedwait*(a1: var Sigset, a2: var SigInfo,
  682. a3: var Timespec): cint {.importc, header: "<signal.h>".}
  683. when defined(sunos) or defined(solaris):
  684. # The following compile time flag is needed on Illumos/Solaris to use the POSIX
  685. # `sigwait` implementation. See the documentation here:
  686. # https://docs.oracle.com/cd/E19455-01/806-5257/6je9h033k/index.html
  687. # https://www.illumos.org/man/2/sigwait
  688. {.passc: "-D_POSIX_PTHREAD_SEMANTICS".}
  689. proc sigwait*(a1: var Sigset, a2: var cint): cint {.
  690. importc, header: "<signal.h>".}
  691. proc sigwaitinfo*(a1: var Sigset, a2: var SigInfo): cint {.
  692. importc, header: "<signal.h>".}
  693. when not defined(nintendoswitch):
  694. proc catclose*(a1: Nl_catd): cint {.importc, header: "<nl_types.h>".}
  695. proc catgets*(a1: Nl_catd, a2, a3: cint, a4: cstring): cstring {.
  696. importc, header: "<nl_types.h>".}
  697. proc catopen*(a1: cstring, a2: cint): Nl_catd {.
  698. importc, header: "<nl_types.h>".}
  699. proc sched_get_priority_max*(a1: cint): cint {.importc, header: "<sched.h>".}
  700. proc sched_get_priority_min*(a1: cint): cint {.importc, header: "<sched.h>".}
  701. proc sched_getparam*(a1: Pid, a2: var Sched_param): cint {.
  702. importc, header: "<sched.h>".}
  703. proc sched_getscheduler*(a1: Pid): cint {.importc, header: "<sched.h>".}
  704. proc sched_rr_get_interval*(a1: Pid, a2: var Timespec): cint {.
  705. importc, header: "<sched.h>".}
  706. proc sched_setparam*(a1: Pid, a2: var Sched_param): cint {.
  707. importc, header: "<sched.h>".}
  708. proc sched_setscheduler*(a1: Pid, a2: cint, a3: var Sched_param): cint {.
  709. importc, header: "<sched.h>".}
  710. proc sched_yield*(): cint {.importc, header: "<sched.h>".}
  711. proc hstrerror*(herrnum: cint): cstring {.importc:"(char *)$1", header: "<netdb.h>".}
  712. proc FD_CLR*(a1: cint, a2: var TFdSet) {.importc, header: "<sys/select.h>".}
  713. proc FD_ISSET*(a1: cint | SocketHandle, a2: var TFdSet): cint {.
  714. importc, header: "<sys/select.h>".}
  715. proc FD_SET*(a1: cint | SocketHandle, a2: var TFdSet) {.
  716. importc: "FD_SET", header: "<sys/select.h>".}
  717. proc FD_ZERO*(a1: var TFdSet) {.importc, header: "<sys/select.h>".}
  718. proc pselect*(a1: cint, a2, a3, a4: ptr TFdSet, a5: ptr Timespec,
  719. a6: var Sigset): cint {.importc, header: "<sys/select.h>".}
  720. proc select*(a1: cint | SocketHandle, a2, a3, a4: ptr TFdSet, a5: ptr Timeval): cint {.
  721. importc, header: "<sys/select.h>".}
  722. when hasSpawnH:
  723. proc posix_spawn*(a1: var Pid, a2: cstring,
  724. a3: var Tposix_spawn_file_actions,
  725. a4: var Tposix_spawnattr,
  726. a5, a6: cstringArray): cint {.importc, header: "<spawn.h>".}
  727. proc posix_spawn_file_actions_addclose*(a1: var Tposix_spawn_file_actions,
  728. a2: cint): cint {.importc, header: "<spawn.h>".}
  729. proc posix_spawn_file_actions_adddup2*(a1: var Tposix_spawn_file_actions,
  730. a2, a3: cint): cint {.importc, header: "<spawn.h>".}
  731. proc posix_spawn_file_actions_addopen*(a1: var Tposix_spawn_file_actions,
  732. a2: cint, a3: cstring, a4: cint, a5: Mode): cint {.
  733. importc, header: "<spawn.h>".}
  734. proc posix_spawn_file_actions_destroy*(
  735. a1: var Tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".}
  736. proc posix_spawn_file_actions_init*(
  737. a1: var Tposix_spawn_file_actions): cint {.importc, header: "<spawn.h>".}
  738. proc posix_spawnattr_destroy*(a1: var Tposix_spawnattr): cint {.
  739. importc, header: "<spawn.h>".}
  740. proc posix_spawnattr_getsigdefault*(a1: var Tposix_spawnattr,
  741. a2: var Sigset): cint {.importc, header: "<spawn.h>".}
  742. proc posix_spawnattr_getflags*(a1: var Tposix_spawnattr,
  743. a2: var cshort): cint {.importc, header: "<spawn.h>".}
  744. proc posix_spawnattr_getpgroup*(a1: var Tposix_spawnattr,
  745. a2: var Pid): cint {.importc, header: "<spawn.h>".}
  746. proc posix_spawnattr_getschedparam*(a1: var Tposix_spawnattr,
  747. a2: var Sched_param): cint {.importc, header: "<spawn.h>".}
  748. proc posix_spawnattr_getschedpolicy*(a1: var Tposix_spawnattr,
  749. a2: var cint): cint {.importc, header: "<spawn.h>".}
  750. proc posix_spawnattr_getsigmask*(a1: var Tposix_spawnattr,
  751. a2: var Sigset): cint {.importc, header: "<spawn.h>".}
  752. proc posix_spawnattr_init*(a1: var Tposix_spawnattr): cint {.
  753. importc, header: "<spawn.h>".}
  754. proc posix_spawnattr_setsigdefault*(a1: var Tposix_spawnattr,
  755. a2: var Sigset): cint {.importc, header: "<spawn.h>".}
  756. proc posix_spawnattr_setflags*(a1: var Tposix_spawnattr, a2: cint): cint {.
  757. importc, header: "<spawn.h>".}
  758. proc posix_spawnattr_setpgroup*(a1: var Tposix_spawnattr, a2: Pid): cint {.
  759. importc, header: "<spawn.h>".}
  760. proc posix_spawnattr_setschedparam*(a1: var Tposix_spawnattr,
  761. a2: var Sched_param): cint {.importc, header: "<spawn.h>".}
  762. proc posix_spawnattr_setschedpolicy*(a1: var Tposix_spawnattr,
  763. a2: cint): cint {.
  764. importc, header: "<spawn.h>".}
  765. proc posix_spawnattr_setsigmask*(a1: var Tposix_spawnattr,
  766. a2: var Sigset): cint {.importc, header: "<spawn.h>".}
  767. proc posix_spawnp*(a1: var Pid, a2: cstring,
  768. a3: var Tposix_spawn_file_actions,
  769. a4: var Tposix_spawnattr,
  770. a5, a6: cstringArray): cint {.importc, header: "<spawn.h>".}
  771. when not defined(nintendoswitch):
  772. proc getcontext*(a1: var Ucontext): cint {.importc, header: "<ucontext.h>".}
  773. proc makecontext*(a1: var Ucontext, a4: proc (){.noconv.}, a3: cint) {.
  774. varargs, importc, header: "<ucontext.h>".}
  775. proc setcontext*(a1: var Ucontext): cint {.importc, header: "<ucontext.h>".}
  776. proc swapcontext*(a1, a2: var Ucontext): cint {.importc, header: "<ucontext.h>".}
  777. proc readv*(a1: cint, a2: ptr IOVec, a3: cint): int {.
  778. importc, header: "<sys/uio.h>".}
  779. proc writev*(a1: cint, a2: ptr IOVec, a3: cint): int {.
  780. importc, header: "<sys/uio.h>".}
  781. proc CMSG_DATA*(cmsg: ptr Tcmsghdr): cstring {.
  782. importc, header: "<sys/socket.h>".}
  783. proc CMSG_NXTHDR*(mhdr: ptr Tmsghdr, cmsg: ptr Tcmsghdr): ptr Tcmsghdr {.
  784. importc, header: "<sys/socket.h>".}
  785. proc CMSG_FIRSTHDR*(mhdr: ptr Tmsghdr): ptr Tcmsghdr {.
  786. importc, header: "<sys/socket.h>".}
  787. proc CMSG_SPACE*(len: csize_t): csize_t {.
  788. importc, header: "<sys/socket.h>".}
  789. proc CMSG_LEN*(len: csize_t): csize_t {.
  790. importc, header: "<sys/socket.h>".}
  791. const
  792. INVALID_SOCKET* = SocketHandle(-1)
  793. proc `==`*(x, y: SocketHandle): bool {.borrow.}
  794. proc accept*(a1: SocketHandle, a2: ptr SockAddr, a3: ptr SockLen): SocketHandle {.
  795. importc, header: "<sys/socket.h>", sideEffect.}
  796. when defined(linux) or defined(bsd):
  797. proc accept4*(a1: SocketHandle, a2: ptr SockAddr, a3: ptr SockLen,
  798. flags: cint): SocketHandle {.importc, header: "<sys/socket.h>".}
  799. proc bindSocket*(a1: SocketHandle, a2: ptr SockAddr, a3: SockLen): cint {.
  800. importc: "bind", header: "<sys/socket.h>".}
  801. ## is Posix's `bind`, because `bind` is a reserved word
  802. proc connect*(a1: SocketHandle, a2: ptr SockAddr, a3: SockLen): cint {.
  803. importc, header: "<sys/socket.h>".}
  804. proc getpeername*(a1: SocketHandle, a2: ptr SockAddr, a3: ptr SockLen): cint {.
  805. importc, header: "<sys/socket.h>".}
  806. proc getsockname*(a1: SocketHandle, a2: ptr SockAddr, a3: ptr SockLen): cint {.
  807. importc, header: "<sys/socket.h>".}
  808. proc getsockopt*(a1: SocketHandle, a2, a3: cint, a4: pointer, a5: ptr SockLen): cint {.
  809. importc, header: "<sys/socket.h>".}
  810. proc listen*(a1: SocketHandle, a2: cint): cint {.
  811. importc, header: "<sys/socket.h>", sideEffect.}
  812. proc recv*(a1: SocketHandle, a2: pointer, a3: int, a4: cint): int {.
  813. importc, header: "<sys/socket.h>", sideEffect.}
  814. proc recvfrom*(a1: SocketHandle, a2: pointer, a3: int, a4: cint,
  815. a5: ptr SockAddr, a6: ptr SockLen): int {.
  816. importc, header: "<sys/socket.h>", sideEffect.}
  817. proc recvmsg*(a1: SocketHandle, a2: ptr Tmsghdr, a3: cint): int {.
  818. importc, header: "<sys/socket.h>", sideEffect.}
  819. proc send*(a1: SocketHandle, a2: pointer, a3: int, a4: cint): int {.
  820. importc, header: "<sys/socket.h>", sideEffect.}
  821. proc sendmsg*(a1: SocketHandle, a2: ptr Tmsghdr, a3: cint): int {.
  822. importc, header: "<sys/socket.h>", sideEffect.}
  823. proc sendto*(a1: SocketHandle, a2: pointer, a3: int, a4: cint, a5: ptr SockAddr,
  824. a6: SockLen): int {.
  825. importc, header: "<sys/socket.h>", sideEffect.}
  826. proc setsockopt*(a1: SocketHandle, a2, a3: cint, a4: pointer, a5: SockLen): cint {.
  827. importc, header: "<sys/socket.h>".}
  828. proc shutdown*(a1: SocketHandle, a2: cint): cint {.
  829. importc, header: "<sys/socket.h>".}
  830. proc socket*(a1, a2, a3: cint): SocketHandle {.
  831. importc, header: "<sys/socket.h>".}
  832. proc sockatmark*(a1: cint): cint {.
  833. importc, header: "<sys/socket.h>".}
  834. proc socketpair*(a1, a2, a3: cint, a4: var array[0..1, cint]): cint {.
  835. importc, header: "<sys/socket.h>".}
  836. proc if_nametoindex*(a1: cstring): cint {.importc, header: "<net/if.h>".}
  837. proc if_indextoname*(a1: cint, a2: cstring): cstring {.
  838. importc, header: "<net/if.h>".}
  839. proc if_nameindex*(): ptr Tif_nameindex {.importc, header: "<net/if.h>".}
  840. proc if_freenameindex*(a1: ptr Tif_nameindex) {.importc, header: "<net/if.h>".}
  841. proc IN6_IS_ADDR_UNSPECIFIED* (a1: ptr In6Addr): cint {.
  842. importc, header: "<netinet/in.h>".}
  843. ## Unspecified address.
  844. proc IN6_IS_ADDR_LOOPBACK* (a1: ptr In6Addr): cint {.
  845. importc, header: "<netinet/in.h>".}
  846. ## Loopback address.
  847. proc IN6_IS_ADDR_MULTICAST* (a1: ptr In6Addr): cint {.
  848. importc, header: "<netinet/in.h>".}
  849. ## Multicast address.
  850. proc IN6_IS_ADDR_LINKLOCAL* (a1: ptr In6Addr): cint {.
  851. importc, header: "<netinet/in.h>".}
  852. ## Unicast link-local address.
  853. proc IN6_IS_ADDR_SITELOCAL* (a1: ptr In6Addr): cint {.
  854. importc, header: "<netinet/in.h>".}
  855. ## Unicast site-local address.
  856. when defined(lwip):
  857. proc IN6_IS_ADDR_V4MAPPED*(ipv6_address: ptr In6Addr): cint =
  858. var bits32: ptr array[4, uint32] = cast[ptr array[4, uint32]](ipv6_address)
  859. return (bits32[1] == 0'u32 and bits32[2] == htonl(0x0000FFFF)).cint
  860. else:
  861. proc IN6_IS_ADDR_V4MAPPED* (a1: ptr In6Addr): cint {.
  862. importc, header: "<netinet/in.h>".}
  863. ## IPv4 mapped address.
  864. proc IN6_IS_ADDR_V4COMPAT* (a1: ptr In6Addr): cint {.
  865. importc, header: "<netinet/in.h>".}
  866. ## IPv4-compatible address.
  867. proc IN6_IS_ADDR_MC_NODELOCAL* (a1: ptr In6Addr): cint {.
  868. importc, header: "<netinet/in.h>".}
  869. ## Multicast node-local address.
  870. proc IN6_IS_ADDR_MC_LINKLOCAL* (a1: ptr In6Addr): cint {.
  871. importc, header: "<netinet/in.h>".}
  872. ## Multicast link-local address.
  873. proc IN6_IS_ADDR_MC_SITELOCAL* (a1: ptr In6Addr): cint {.
  874. importc, header: "<netinet/in.h>".}
  875. ## Multicast site-local address.
  876. proc IN6_IS_ADDR_MC_ORGLOCAL* (a1: ptr In6Addr): cint {.
  877. importc, header: "<netinet/in.h>".}
  878. ## Multicast organization-local address.
  879. proc IN6_IS_ADDR_MC_GLOBAL* (a1: ptr In6Addr): cint {.
  880. importc, header: "<netinet/in.h>".}
  881. ## Multicast global address.
  882. proc endhostent*() {.importc, header: "<netdb.h>".}
  883. proc endnetent*() {.importc, header: "<netdb.h>".}
  884. proc endprotoent*() {.importc, header: "<netdb.h>".}
  885. proc endservent*() {.importc, header: "<netdb.h>".}
  886. proc freeAddrInfo*(a1: ptr AddrInfo) {.importc: "freeaddrinfo", header: "<netdb.h>".}
  887. proc gai_strerror*(a1: cint): cstring {.importc:"(char *)$1", header: "<netdb.h>".}
  888. proc getaddrinfo*(a1, a2: cstring, a3: ptr AddrInfo,
  889. a4: var ptr AddrInfo): cint {.importc, header: "<netdb.h>".}
  890. when not defined(android4):
  891. proc gethostbyaddr*(a1: pointer, a2: SockLen, a3: cint): ptr Hostent {.
  892. importc, header: "<netdb.h>".}
  893. else:
  894. proc gethostbyaddr*(a1: cstring, a2: cint, a3: cint): ptr Hostent {.
  895. importc, header: "<netdb.h>".}
  896. proc gethostbyname*(a1: cstring): ptr Hostent {.importc, header: "<netdb.h>".}
  897. proc gethostent*(): ptr Hostent {.importc, header: "<netdb.h>".}
  898. proc getnameinfo*(a1: ptr SockAddr, a2: SockLen,
  899. a3: cstring, a4: SockLen, a5: cstring,
  900. a6: SockLen, a7: cint): cint {.importc, header: "<netdb.h>".}
  901. proc getnetbyaddr*(a1: int32, a2: cint): ptr Tnetent {.importc, header: "<netdb.h>".}
  902. proc getnetbyname*(a1: cstring): ptr Tnetent {.importc, header: "<netdb.h>".}
  903. proc getnetent*(): ptr Tnetent {.importc, header: "<netdb.h>".}
  904. proc getprotobyname*(a1: cstring): ptr Protoent {.importc, header: "<netdb.h>".}
  905. proc getprotobynumber*(a1: cint): ptr Protoent {.importc, header: "<netdb.h>".}
  906. proc getprotoent*(): ptr Protoent {.importc, header: "<netdb.h>".}
  907. proc getservbyname*(a1, a2: cstring): ptr Servent {.importc, header: "<netdb.h>".}
  908. proc getservbyport*(a1: cint, a2: cstring): ptr Servent {.
  909. importc, header: "<netdb.h>".}
  910. proc getservent*(): ptr Servent {.importc, header: "<netdb.h>".}
  911. proc sethostent*(a1: cint) {.importc, header: "<netdb.h>".}
  912. proc setnetent*(a1: cint) {.importc, header: "<netdb.h>".}
  913. proc setprotoent*(a1: cint) {.importc, header: "<netdb.h>".}
  914. proc setservent*(a1: cint) {.importc, header: "<netdb.h>".}
  915. when not defined(lwip):
  916. proc poll*(a1: ptr TPollfd, a2: Tnfds, a3: int): cint {.
  917. importc, header: "<poll.h>", sideEffect.}
  918. proc realpath*(name, resolved: cstring): cstring {.
  919. importc: "realpath", header: "<stdlib.h>".}
  920. proc mkstemp*(tmpl: cstring): cint {.importc, header: "<stdlib.h>", sideEffect.}
  921. ## Creates a unique temporary file.
  922. ##
  923. ## .. warning:: The `tmpl` argument is written to by `mkstemp` and thus
  924. ## can't be a string literal. If in doubt make a copy of the cstring before
  925. ## passing it in.
  926. proc mkstemps*(tmpl: cstring, suffixlen: int): cint {.importc, header: "<stdlib.h>", sideEffect.}
  927. ## Creates a unique temporary file.
  928. ##
  929. ## .. warning:: The `tmpl` argument is written to by `mkstemps` and thus
  930. ## can't be a string literal. If in doubt make a copy of the cstring before
  931. ## passing it in.
  932. proc mkdtemp*(tmpl: cstring): pointer {.importc, header: "<stdlib.h>", sideEffect.}
  933. when defined(linux) or defined(bsd) or defined(osx):
  934. proc mkostemp*(tmpl: cstring, oflags: cint): cint {.importc, header: "<stdlib.h>", sideEffect.}
  935. proc mkostemps*(tmpl: cstring, suffixlen: cint, oflags: cint): cint {.importc, header: "<stdlib.h>", sideEffect.}
  936. proc posix_memalign*(memptr: pointer, alignment: csize_t, size: csize_t): cint {.importc, header: "<stdlib.h>".}
  937. proc utimes*(path: cstring, times: ptr array[2, Timeval]): int {.
  938. importc: "utimes", header: "<sys/time.h>", sideEffect.}
  939. ## Sets file access and modification times.
  940. ##
  941. ## Pass the filename and an array of times to set the access and modification
  942. ## times respectively. If you pass nil as the array both attributes will be
  943. ## set to the current time.
  944. ##
  945. ## Returns zero on success.
  946. ##
  947. ## For more information read http://www.unix.com/man-page/posix/3/utimes/.
  948. proc handle_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.importc: "signal", header: "<signal.h>".}
  949. template onSignal*(signals: varargs[cint], body: untyped) =
  950. ## Setup code to be executed when Unix signals are received. The
  951. ## currently handled signal is injected as `sig` into the calling
  952. ## scope.
  953. ##
  954. ## Example:
  955. ##
  956. ## .. code-block::
  957. ## from std/posix import SIGINT, SIGTERM, onSignal
  958. ## onSignal(SIGINT, SIGTERM):
  959. ## echo "bye from signal ", sig
  960. for s in signals:
  961. handle_signal(s,
  962. proc (signal: cint) {.noconv.} =
  963. let sig {.inject.} = signal
  964. body
  965. )
  966. type
  967. RLimit* {.importc: "struct rlimit",
  968. header: "<sys/resource.h>", pure, final.} = object
  969. rlim_cur*: int
  970. rlim_max*: int
  971. ## The getrlimit() and setrlimit() system calls get and set resource limits respectively.
  972. ## Each resource has an associated soft and hard limit, as defined by the RLimit structure
  973. proc setrlimit*(resource: cint, rlp: var RLimit): cint
  974. {.importc: "setrlimit",header: "<sys/resource.h>".}
  975. ## The setrlimit() system calls sets resource limits.
  976. proc getrlimit*(resource: cint, rlp: var RLimit): cint
  977. {.importc: "getrlimit",header: "<sys/resource.h>".}
  978. ## The getrlimit() system call gets resource limits.
  979. when defined(nimHasStyleChecks):
  980. {.pop.} # {.push styleChecks: off.}