posix.nim 51 KB

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