posix_linux_amd64.nim 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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. # Types here should conform to the glibc ABI on linux / x86_64
  10. # When adding a type, the order and size of fields must match
  11. # To be included from posix.nim!
  12. const
  13. hasSpawnH = not defined(haiku) # should exist for every Posix system nowadays
  14. hasAioH = defined(linux)
  15. # On Linux:
  16. # timer_{create,delete,settime,gettime},
  17. # clock_{getcpuclockid, getres, gettime, nanosleep, settime} lives in librt
  18. {.passl: "-lrt".}
  19. when defined(nimHasStyleChecks):
  20. {.push styleChecks: off.}
  21. # Types
  22. type
  23. DIR* {.importc: "DIR", header: "<dirent.h>",
  24. incompleteStruct.} = object
  25. ## A type representing a directory stream.
  26. type
  27. SocketHandle* = distinct cint # The type used to represent socket descriptors
  28. # not detected by detect.nim, guarded by #ifdef __USE_UNIX98 in glibc
  29. const SIG_HOLD* = cast[Sighandler](2)
  30. type
  31. Time* {.importc: "time_t", header: "<time.h>".} = distinct clong
  32. Timespec* {.importc: "struct timespec",
  33. header: "<time.h>", final, pure.} = object ## struct timespec
  34. tv_sec*: Time ## Seconds.
  35. tv_nsec*: clong ## Nanoseconds.
  36. Dirent* {.importc: "struct dirent",
  37. header: "<dirent.h>", final, pure.} = object ## dirent_t struct
  38. d_ino*: Ino
  39. d_off*: Off
  40. d_reclen*: cushort
  41. d_type*: int8 # cuchar really!
  42. d_name*: array[256, cchar]
  43. Tflock* {.importc: "struct flock", final, pure,
  44. header: "<fcntl.h>".} = object ## flock type
  45. l_type*: cshort ## Type of lock; F_RDLCK, F_WRLCK, F_UNLCK.
  46. l_whence*: cshort ## Flag for starting offset.
  47. l_start*: Off ## Relative offset in bytes.
  48. l_len*: Off ## Size; if 0 then until EOF.
  49. l_pid*: Pid ## Process ID of the process holding the lock;
  50. ## returned with F_GETLK.
  51. # no struct FTW on linux
  52. Glob* {.importc: "glob_t", header: "<glob.h>",
  53. final, pure.} = object ## glob_t
  54. gl_pathc*: csize ## Count of paths matched by pattern.
  55. gl_pathv*: cstringArray ## Pointer to a list of matched pathnames.
  56. gl_offs*: csize ## Slots to reserve at the beginning of gl_pathv.
  57. gl_flags*: cint
  58. gl_closedir*: pointer
  59. gl_readdir*: pointer
  60. gl_opendir*: pointer
  61. gl_lstat*: pointer
  62. gl_stat*: pointer
  63. Group* {.importc: "struct group", header: "<grp.h>",
  64. final, pure.} = object ## struct group
  65. gr_name*: cstring ## The name of the group.
  66. gr_passwd*: cstring
  67. gr_gid*: Gid ## Numerical group ID.
  68. gr_mem*: cstringArray ## Pointer to a null-terminated array of character
  69. ## pointers to member names.
  70. Iconv* {.importc: "iconv_t", header: "<iconv.h>".} = pointer
  71. ## Identifies the conversion from one codeset to another.
  72. Lconv* {.importc: "struct lconv", header: "<locale.h>", final,
  73. pure.} = object
  74. decimal_point*: cstring
  75. thousands_sep*: cstring
  76. grouping*: cstring
  77. int_curr_symbol*: cstring
  78. currency_symbol*: cstring
  79. mon_decimal_point*: cstring
  80. mon_thousands_sep*: cstring
  81. mon_grouping*: cstring
  82. positive_sign*: cstring
  83. negative_sign*: cstring
  84. int_frac_digits*: char
  85. frac_digits*: char
  86. p_cs_precedes*: char
  87. p_sep_by_space*: char
  88. n_cs_precedes*: char
  89. n_sep_by_space*: char
  90. p_sign_posn*: char
  91. n_sign_posn*: char
  92. int_p_cs_precedes*: char
  93. int_p_sep_by_space*: char
  94. int_n_cs_precedes*: char
  95. int_n_sep_by_space*: char
  96. int_p_sign_posn*: char
  97. int_n_sign_posn*: char
  98. Mqd* {.importc: "mqd_t", header: "<mqueue.h>".} = cint
  99. MqAttr* {.importc: "struct mq_attr",
  100. header: "<mqueue.h>",
  101. final, pure.} = object ## message queue attribute
  102. mq_flags*: clong ## Message queue flags.
  103. mq_maxmsg*: clong ## Maximum number of messages.
  104. mq_msgsize*: clong ## Maximum message size.
  105. mq_curmsgs*: clong ## Number of messages currently queued.
  106. pad: array[4, clong]
  107. Passwd* {.importc: "struct passwd", header: "<pwd.h>",
  108. final, pure.} = object ## struct passwd
  109. pw_name*: cstring ## User's login name.
  110. pw_passwd*: cstring
  111. pw_uid*: Uid ## Numerical user ID.
  112. pw_gid*: Gid ## Numerical group ID.
  113. pw_gecos*: cstring
  114. pw_dir*: cstring ## Initial working directory.
  115. pw_shell*: cstring ## Program to use as shell.
  116. Blkcnt* {.importc: "blkcnt_t", header: "<sys/types.h>".} = clong
  117. ## used for file block counts
  118. Blksize* {.importc: "blksize_t", header: "<sys/types.h>".} = clong
  119. ## used for block sizes
  120. Clock* {.importc: "clock_t", header: "<sys/types.h>".} = clong
  121. ClockId* {.importc: "clockid_t", header: "<sys/types.h>".} = cint
  122. Dev* {.importc: "dev_t", header: "<sys/types.h>".} = culong
  123. Fsblkcnt* {.importc: "fsblkcnt_t", header: "<sys/types.h>".} = culong
  124. Fsfilcnt* {.importc: "fsfilcnt_t", header: "<sys/types.h>".} = culong
  125. Gid* {.importc: "gid_t", header: "<sys/types.h>".} = cuint
  126. Id* {.importc: "id_t", header: "<sys/types.h>".} = cuint
  127. Ino* {.importc: "ino_t", header: "<sys/types.h>".} = culong
  128. Key* {.importc: "key_t", header: "<sys/types.h>".} = cint
  129. Mode* {.importc: "mode_t", header: "<sys/types.h>".} = uint32
  130. Nlink* {.importc: "nlink_t", header: "<sys/types.h>".} = culong
  131. Off* {.importc: "off_t", header: "<sys/types.h>".} = clong
  132. Pid* {.importc: "pid_t", header: "<sys/types.h>".} = cint
  133. Pthread_attr* {.importc: "pthread_attr_t", header: "<sys/types.h>",
  134. pure, final.} = object
  135. abi: array[56 div sizeof(clong), clong]
  136. Pthread_barrier* {.importc: "pthread_barrier_t",
  137. header: "<sys/types.h>", pure, final.} = object
  138. abi: array[32 div sizeof(clong), clong]
  139. Pthread_barrierattr* {.importc: "pthread_barrierattr_t",
  140. header: "<sys/types.h>", pure, final.} = object
  141. abi: array[4 div sizeof(cint), cint]
  142. Pthread_cond* {.importc: "pthread_cond_t", header: "<sys/types.h>",
  143. pure, final.} = object
  144. abi: array[48 div sizeof(clonglong), clonglong]
  145. Pthread_condattr* {.importc: "pthread_condattr_t",
  146. header: "<sys/types.h>", pure, final.} = object
  147. abi: array[4 div sizeof(cint), cint]
  148. Pthread_key* {.importc: "pthread_key_t", header: "<sys/types.h>".} = cuint
  149. Pthread_mutex* {.importc: "pthread_mutex_t", header: "<sys/types.h>",
  150. pure, final.} = object
  151. abi: array[48 div sizeof(clong), clong]
  152. Pthread_mutexattr* {.importc: "pthread_mutexattr_t",
  153. header: "<sys/types.h>", pure, final.} = object
  154. abi: array[4 div sizeof(cint), cint]
  155. Pthread_once* {.importc: "pthread_once_t", header: "<sys/types.h>".} = cint
  156. Pthread_rwlock* {.importc: "pthread_rwlock_t",
  157. header: "<sys/types.h>", pure, final.} = object
  158. abi: array[56 div sizeof(clong), clong]
  159. Pthread_rwlockattr* {.importc: "pthread_rwlockattr_t",
  160. header: "<sys/types.h>".} = object
  161. abi: array[8 div sizeof(clong), clong]
  162. Pthread_spinlock* {.importc: "pthread_spinlock_t",
  163. header: "<sys/types.h>".} = cint
  164. Pthread* {.importc: "pthread_t", header: "<sys/types.h>".} = culong
  165. Suseconds* {.importc: "suseconds_t", header: "<sys/types.h>".} = clong
  166. #Ttime* {.importc: "time_t", header: "<sys/types.h>".} = int
  167. Timer* {.importc: "timer_t", header: "<sys/types.h>".} = pointer
  168. Uid* {.importc: "uid_t", header: "<sys/types.h>".} = cuint
  169. Useconds* {.importc: "useconds_t", header: "<sys/types.h>".} = cuint
  170. Utsname* {.importc: "struct utsname",
  171. header: "<sys/utsname.h>",
  172. final, pure.} = object ## struct utsname
  173. sysname*, ## Name of this implementation of the operating system.
  174. nodename*, ## Name of this node within the communications
  175. ## network to which this node is attached, if any.
  176. release*, ## Current release level of this implementation.
  177. version*, ## Current version level of this release.
  178. machine*, ## Name of the hardware type on which the
  179. ## system is running.
  180. domainname*: array[65, char]
  181. Sem* {.importc: "sem_t", header: "<semaphore.h>", final, pure.} = object
  182. abi: array[32 div sizeof(clong), clong]
  183. Ipc_perm* {.importc: "struct ipc_perm",
  184. header: "<sys/ipc.h>", final, pure.} = object ## struct ipc_perm
  185. key: Key
  186. uid*: Uid ## Owner's user ID.
  187. gid*: Gid ## Owner's group ID.
  188. cuid*: Uid ## Creator's user ID.
  189. cgid*: Gid ## Creator's group ID.
  190. mode*: cshort ## Read/write permission.
  191. pad1: cshort
  192. seq1: cshort
  193. pad2: cshort
  194. reserved1: culong
  195. reserved2: culong
  196. Stat* {.importc: "struct stat",
  197. header: "<sys/stat.h>", final, pure.} = object ## struct stat
  198. st_dev*: Dev ## Device ID of device containing file.
  199. st_ino*: Ino ## File serial number.
  200. st_nlink*: Nlink ## Number of hard links to the file.
  201. st_mode*: Mode ## Mode of file (see below).
  202. st_uid*: Uid ## User ID of file.
  203. st_gid*: Gid ## Group ID of file.
  204. pad0: cint
  205. st_rdev*: Dev ## Device ID (if file is character or block special).
  206. st_size*: Off ## For regular files, the file size in bytes.
  207. ## For symbolic links, the length in bytes of the
  208. ## pathname contained in the symbolic link.
  209. ## For a shared memory object, the length in bytes.
  210. ## For a typed memory object, the length in bytes.
  211. ## For other file types, the use of this field is
  212. ## unspecified.
  213. st_blksize*: Blksize ## A file system-specific preferred I/O block size
  214. ## for this object. In some file system types, this
  215. ## may vary from file to file.
  216. st_blocks*: Blkcnt ## Number of blocks allocated for this object.
  217. st_atim*: Timespec ## Time of last access.
  218. st_mtim*: Timespec ## Time of last data modification.
  219. st_ctim*: Timespec ## Time of last status change.
  220. reserved: array[3, clong]
  221. Statvfs* {.importc: "struct statvfs", header: "<sys/statvfs.h>",
  222. final, pure.} = object ## struct statvfs
  223. f_bsize*: culong ## File system block size.
  224. f_frsize*: culong ## Fundamental file system block size.
  225. f_blocks*: Fsblkcnt ## Total number of blocks on file system
  226. ## in units of f_frsize.
  227. f_bfree*: Fsblkcnt ## Total number of free blocks.
  228. f_bavail*: Fsblkcnt ## Number of free blocks available to
  229. ## non-privileged process.
  230. f_files*: Fsfilcnt ## Total number of file serial numbers.
  231. f_ffree*: Fsfilcnt ## Total number of free file serial numbers.
  232. f_favail*: Fsfilcnt ## Number of file serial numbers available to
  233. ## non-privileged process.
  234. f_fsid*: culong ## File system ID.
  235. f_flag*: culong ## Bit mask of f_flag values.
  236. f_namemax*: culong ## Maximum filename length.
  237. f_spare: array[6, cint]
  238. # No Posix_typed_mem_info
  239. Tm* {.importc: "struct tm", header: "<time.h>",
  240. final, pure.} = object ## struct tm
  241. tm_sec*: cint ## Seconds [0,60].
  242. tm_min*: cint ## Minutes [0,59].
  243. tm_hour*: cint ## Hour [0,23].
  244. tm_mday*: cint ## Day of month [1,31].
  245. tm_mon*: cint ## Month of year [0,11].
  246. tm_year*: cint ## Years since 1900.
  247. tm_wday*: cint ## Day of week [0,6] (Sunday =0).
  248. tm_yday*: cint ## Day of year [0,365].
  249. tm_isdst*: cint ## Daylight Savings flag.
  250. tm_gmtoff*: clong
  251. tm_zone*: cstring
  252. Itimerspec* {.importc: "struct itimerspec", header: "<time.h>",
  253. final, pure.} = object ## struct itimerspec
  254. it_interval*: Timespec ## Timer period.
  255. it_value*: Timespec ## Timer expiration.
  256. Sig_atomic* {.importc: "sig_atomic_t", header: "<signal.h>".} = cint
  257. ## Possibly volatile-qualified integer type of an object that can be
  258. ## accessed as an atomic entity, even in the presence of asynchronous
  259. ## interrupts.
  260. Sigset* {.importc: "sigset_t", header: "<signal.h>", final, pure.} = object
  261. abi: array[1024 div (8 * sizeof(culong)), culong]
  262. SigEvent* {.importc: "struct sigevent",
  263. header: "<signal.h>", final, pure.} = object ## struct sigevent
  264. sigev_value*: SigVal ## Signal value.
  265. sigev_signo*: cint ## Signal number.
  266. sigev_notify*: cint ## Notification type.
  267. sigev_notify_function*: proc (x: SigVal) {.noconv.} ## Notification func.
  268. sigev_notify_attributes*: ptr Pthread_attr ## Notification attributes.
  269. abi: array[12, int]
  270. SigVal* {.importc: "union sigval",
  271. header: "<signal.h>", final, pure.} = object ## struct sigval
  272. sival_ptr*: pointer ## pointer signal value;
  273. ## integer signal value not defined!
  274. Sigaction* {.importc: "struct sigaction",
  275. header: "<signal.h>", final, pure.} = object ## struct sigaction
  276. sa_handler*: proc (x: cint) {.noconv.} ## Pointer to a signal-catching
  277. ## function or one of the macros
  278. ## SIG_IGN or SIG_DFL.
  279. sa_mask*: Sigset ## Set of signals to be blocked during execution of
  280. ## the signal handling function.
  281. sa_flags*: cint ## Special flags.
  282. sa_sigaction*: proc (x: cint, y: ptr SigInfo, z: pointer) {.noconv.}
  283. Stack* {.importc: "stack_t",
  284. header: "<signal.h>", final, pure.} = object ## stack_t
  285. ss_sp*: pointer ## Stack base or pointer.
  286. ss_size*: int ## Stack size.
  287. ss_flags*: cint ## Flags.
  288. SigStack* {.importc: "struct sigstack",
  289. header: "<signal.h>", final, pure.} = object ## struct sigstack
  290. ss_onstack*: cint ## Non-zero when signal stack is in use.
  291. ss_sp*: pointer ## Signal stack pointer.
  292. SigInfo* {.importc: "siginfo_t",
  293. header: "<signal.h>", final, pure.} = object ## siginfo_t
  294. si_signo*: cint ## Signal number.
  295. si_code*: cint ## Signal code.
  296. si_errno*: cint ## If non-zero, an errno value associated with
  297. ## this signal, as defined in <errno.h>.
  298. si_pid*: Pid ## Sending process ID.
  299. si_uid*: Uid ## Real user ID of sending process.
  300. si_addr*: pointer ## Address of faulting instruction.
  301. si_status*: cint ## Exit value or signal.
  302. si_band*: int ## Band event for SIGPOLL.
  303. si_value*: SigVal ## Signal value.
  304. pad {.importc: "_pad"}: array[128 - 56, uint8]
  305. Nl_item* {.importc: "nl_item", header: "<nl_types.h>".} = cint
  306. Nl_catd* {.importc: "nl_catd", header: "<nl_types.h>".} = pointer
  307. Sched_param* {.importc: "struct sched_param",
  308. header: "<sched.h>",
  309. final, pure.} = object ## struct sched_param
  310. sched_priority*: cint
  311. Timeval* {.importc: "struct timeval", header: "<sys/select.h>",
  312. final, pure.} = object ## struct timeval
  313. tv_sec*: Time ## Seconds.
  314. tv_usec*: Suseconds ## Microseconds.
  315. TFdSet* {.importc: "fd_set", header: "<sys/select.h>",
  316. final, pure.} = object
  317. abi: array[1024 div (8 * sizeof(clong)), clong]
  318. Mcontext* {.importc: "mcontext_t", header: "<ucontext.h>",
  319. final, pure.} = object
  320. gregs: array[23, clonglong]
  321. fpregs: pointer
  322. reserved1: array[8, clonglong]
  323. Ucontext* {.importc: "ucontext_t", header: "<ucontext.h>",
  324. final, pure.} = object ## ucontext_t
  325. uc_flags: clong
  326. uc_link*: ptr Ucontext ## Pointer to the context that is resumed
  327. ## when this context returns.
  328. uc_stack*: Stack ## The stack used by this context.
  329. uc_mcontext*: Mcontext ## A machine-specific representation of the saved
  330. ## context.
  331. uc_sigmask*: Sigset ## The set of signals that are blocked when this
  332. ## context is active.
  333. # todo fpregds_mem
  334. type
  335. Taiocb* {.importc: "struct aiocb", header: "<aio.h>",
  336. final, pure.} = object ## struct aiocb
  337. aio_fildes*: cint ## File descriptor.
  338. aio_lio_opcode*: cint ## Operation to be performed.
  339. aio_reqprio*: cint ## Request priority offset.
  340. aio_buf*: pointer ## Location of buffer.
  341. aio_nbytes*: csize ## Length of transfer.
  342. aio_sigevent*: SigEvent ## Signal number and value.
  343. next_prio: pointer
  344. abs_prio: cint
  345. policy: cint
  346. error_Code: cint
  347. return_value: clong
  348. aio_offset*: Off ## File offset.
  349. reserved: array[32, uint8]
  350. when hasSpawnH:
  351. type
  352. Tposix_spawnattr* {.importc: "posix_spawnattr_t",
  353. header: "<spawn.h>", final, pure.} = object
  354. flags: cshort
  355. pgrp: Pid
  356. sd: Sigset
  357. ss: Sigset
  358. sp: Sched_param
  359. policy: cint
  360. pad: array[16, cint]
  361. Tposix_spawn_file_actions* {.importc: "posix_spawn_file_actions_t",
  362. header: "<spawn.h>", final, pure.} = object
  363. allocated: cint
  364. used: cint
  365. actions: pointer
  366. pad: array[16, cint]
  367. # from sys/un.h
  368. const Sockaddr_un_path_length* = 108
  369. type
  370. SockLen* {.importc: "socklen_t", header: "<sys/socket.h>".} = cuint
  371. TSa_Family* {.importc: "sa_family_t", header: "<sys/socket.h>".} = cushort
  372. SockAddr* {.importc: "struct sockaddr", header: "<sys/socket.h>",
  373. pure, final.} = object ## struct sockaddr
  374. sa_family*: TSa_Family ## Address family.
  375. sa_data*: array[14, char] ## Socket address (variable-length data).
  376. Sockaddr_un* {.importc: "struct sockaddr_un", header: "<sys/un.h>",
  377. pure, final.} = object ## struct sockaddr_un
  378. sun_family*: TSa_Family ## Address family.
  379. sun_path*: array[108, char] ## Socket path
  380. Sockaddr_storage* {.importc: "struct sockaddr_storage",
  381. header: "<sys/socket.h>",
  382. pure, final.} = object ## struct sockaddr_storage
  383. ss_family*: TSa_Family ## Address family.
  384. ss_padding: array[128 - sizeof(cshort) - sizeof(culong), char]
  385. ss_align: clong
  386. Tif_nameindex* {.importc: "struct if_nameindex", final,
  387. pure, header: "<net/if.h>".} = object ## struct if_nameindex
  388. if_index*: cuint ## Numeric index of the interface.
  389. if_name*: cstring ## Null-terminated name of the interface.
  390. IOVec* {.importc: "struct iovec", pure, final,
  391. header: "<sys/uio.h>".} = object ## struct iovec
  392. iov_base*: pointer ## Base address of a memory region for input or output.
  393. iov_len*: csize ## The size of the memory pointed to by iov_base.
  394. Tmsghdr* {.importc: "struct msghdr", pure, final,
  395. header: "<sys/socket.h>".} = object ## struct msghdr
  396. msg_name*: pointer ## Optional address.
  397. msg_namelen*: SockLen ## Size of address.
  398. msg_iov*: ptr IOVec ## Scatter/gather array.
  399. msg_iovlen*: csize ## Members in msg_iov.
  400. msg_control*: pointer ## Ancillary data; see below.
  401. msg_controllen*: csize ## Ancillary data buffer len.
  402. msg_flags*: cint ## Flags on received message.
  403. Tcmsghdr* {.importc: "struct cmsghdr", pure, final,
  404. header: "<sys/socket.h>".} = object ## struct cmsghdr
  405. cmsg_len*: csize ## Data byte count, including the cmsghdr.
  406. cmsg_level*: cint ## Originating protocol.
  407. cmsg_type*: cint ## Protocol-specific type.
  408. TLinger* {.importc: "struct linger", pure, final,
  409. header: "<sys/socket.h>".} = object ## struct linger
  410. l_onoff*: cint ## Indicates whether linger option is enabled.
  411. l_linger*: cint ## Linger time, in seconds.
  412. # data follows...
  413. InPort* = uint16
  414. InAddrScalar* = uint32
  415. InAddrT* {.importc: "in_addr_t", pure, final,
  416. header: "<netinet/in.h>".} = uint32
  417. InAddr* {.importc: "struct in_addr", pure, final,
  418. header: "<netinet/in.h>".} = object ## struct in_addr
  419. s_addr*: InAddrScalar
  420. Sockaddr_in* {.importc: "struct sockaddr_in", pure, final,
  421. header: "<netinet/in.h>".} = object ## struct sockaddr_in
  422. sin_family*: TSa_Family ## AF_INET.
  423. sin_port*: InPort ## Port number.
  424. sin_addr*: InAddr ## IP address.
  425. sin_zero: array[16 - 2 - 2 - 4, uint8]
  426. In6Addr* {.importc: "struct in6_addr", pure, final,
  427. header: "<netinet/in.h>".} = object ## struct in6_addr
  428. s6_addr*: array[0..15, char]
  429. Sockaddr_in6* {.importc: "struct sockaddr_in6", pure, final,
  430. header: "<netinet/in.h>".} = object ## struct sockaddr_in6
  431. sin6_family*: TSa_Family ## AF_INET6.
  432. sin6_port*: InPort ## Port number.
  433. sin6_flowinfo*: uint32 ## IPv6 traffic class and flow information.
  434. sin6_addr*: In6Addr ## IPv6 address.
  435. sin6_scope_id*: uint32 ## Set of interfaces for a scope.
  436. Tipv6_mreq* {.importc: "struct ipv6_mreq", pure, final,
  437. header: "<netinet/in.h>".} = object ## struct ipv6_mreq
  438. ipv6mr_multiaddr*: In6Addr ## IPv6 multicast address.
  439. ipv6mr_interface*: cuint ## Interface index.
  440. Hostent* {.importc: "struct hostent", pure, final,
  441. header: "<netdb.h>".} = object ## struct hostent
  442. h_name*: cstring ## Official name of the host.
  443. h_aliases*: cstringArray ## A pointer to an array of pointers to
  444. ## alternative host names, terminated by a
  445. ## null pointer.
  446. h_addrtype*: cint ## Address type.
  447. h_length*: cint ## The length, in bytes, of the address.
  448. h_addr_list*: cstringArray ## A pointer to an array of pointers to network
  449. ## addresses (in network byte order) for the
  450. ## host, terminated by a null pointer.
  451. Tnetent* {.importc: "struct netent", pure, final,
  452. header: "<netdb.h>".} = object ## struct netent
  453. n_name*: cstring ## Official, fully-qualified (including the
  454. ## domain) name of the host.
  455. n_aliases*: cstringArray ## A pointer to an array of pointers to
  456. ## alternative network names, terminated by a
  457. ## null pointer.
  458. n_addrtype*: cint ## The address type of the network.
  459. n_net*: uint32 ## The network number, in host byte order.
  460. Protoent* {.importc: "struct protoent", pure, final,
  461. header: "<netdb.h>".} = object ## struct protoent
  462. p_name*: cstring ## Official name of the protocol.
  463. p_aliases*: cstringArray ## A pointer to an array of pointers to
  464. ## alternative protocol names, terminated by
  465. ## a null pointer.
  466. p_proto*: cint ## The protocol number.
  467. Servent* {.importc: "struct servent", pure, final,
  468. header: "<netdb.h>".} = object ## struct servent
  469. s_name*: cstring ## Official name of the service.
  470. s_aliases*: cstringArray ## A pointer to an array of pointers to
  471. ## alternative service names, terminated by
  472. ## a null pointer.
  473. s_port*: cint ## The port number at which the service
  474. ## resides, in network byte order.
  475. s_proto*: cstring ## The name of the protocol to use when
  476. ## contacting the service.
  477. AddrInfo* {.importc: "struct addrinfo", pure, final,
  478. header: "<netdb.h>".} = object ## struct addrinfo
  479. ai_flags*: cint ## Input flags.
  480. ai_family*: cint ## Address family of socket.
  481. ai_socktype*: cint ## Socket type.
  482. ai_protocol*: cint ## Protocol of socket.
  483. ai_addrlen*: SockLen ## Length of socket address.
  484. ai_addr*: ptr SockAddr ## Socket address of socket.
  485. ai_canonname*: cstring ## Canonical name of service location.
  486. ai_next*: ptr AddrInfo ## Pointer to next in list.
  487. TPollfd* {.importc: "struct pollfd", pure, final,
  488. header: "<poll.h>".} = object ## struct pollfd
  489. fd*: cint ## The following descriptor being polled.
  490. events*: cshort ## The input event flags (see below).
  491. revents*: cshort ## The output event flags (see below).
  492. Tnfds* {.importc: "nfds_t", header: "<poll.h>".} = culong
  493. var
  494. errno* {.importc, header: "<errno.h>".}: cint ## error variable
  495. h_errno* {.importc, header: "<netdb.h>".}: cint
  496. daylight* {.importc, header: "<time.h>".}: cint
  497. timezone* {.importc, header: "<time.h>".}: clong
  498. # Regenerate using detect.nim!
  499. include posix_linux_amd64_consts
  500. const POSIX_SPAWN_USEVFORK* = cint(0x40) # needs _GNU_SOURCE!
  501. # <sys/wait.h>
  502. proc WEXITSTATUS*(s: cint): cint = (s and 0xff00) shr 8
  503. proc WTERMSIG*(s:cint): cint = s and 0x7f
  504. proc WSTOPSIG*(s:cint): cint = WEXITSTATUS(s)
  505. proc WIFEXITED*(s:cint) : bool = WTERMSIG(s) == 0
  506. proc WIFSIGNALED*(s:cint) : bool = (cast[int8]((s and 0x7f) + 1) shr 1) > 0
  507. proc WIFSTOPPED*(s:cint) : bool = (s and 0xff) == 0x7f
  508. proc WIFCONTINUED*(s:cint) : bool = s == WCONTINUED
  509. when defined(nimHasStyleChecks):
  510. {.pop.} # {.push styleChecks: off.}