/platform/unix/common.d

http://github.com/wilkie/djehuty · D · 1141 lines · 876 code · 155 blank · 110 comment · 14 complexity · 7c6b7259bfd4c4f2996cde33c57600c1 MD5 · raw file

  1. /*
  2. * common.d
  3. *
  4. * This file gives the external references for libraries and native APIs.
  5. * For the UNIX environment, this is largely the C standard library. Some
  6. * magic goes into hinting to the runtime in place.
  7. *
  8. * Author: Dave Wilkinson
  9. *
  10. */
  11. module platform.unix.common;
  12. public import X = binding.x.Xlib;
  13. public import Cairo = binding.cairo.cairo;
  14. public import CairoX = binding.cairo.xlib;
  15. public import Pango = binding.pango.pango;
  16. public import binding.c;
  17. public import Curses = binding.ncurses.ncurses;
  18. extern(C):
  19. size_t readlink(char* path, char* buf, size_t len);
  20. int getpid();
  21. char* getenv(char*);
  22. // Directory Streams
  23. struct __direntry;
  24. alias __direntry DIR;
  25. static int _IONBF = 0x2;
  26. struct dirent
  27. {
  28. version(darwin) {
  29. uint d_ino;
  30. ushort d_reclen;
  31. ubyte d_type;
  32. ubyte d_namlen;
  33. char d_name[256];
  34. }
  35. else {
  36. Culong_t d_ino;
  37. Culong_t d_off;
  38. ushort d_reclen;
  39. ubyte d_type;
  40. char d_name[256];
  41. }
  42. }
  43. struct dirent64
  44. {
  45. Culong_t d_ino;
  46. Culong_t d_off;
  47. ushort d_reclen;
  48. ubyte d_type;
  49. char d_name[256];
  50. }
  51. DIR* opendir(char* name);
  52. int closedir(DIR* dp);
  53. dirent* readdir(DIR* dp);
  54. dirent64* readdir64(DIR* dp);
  55. void rewinddir(DIR* dp);
  56. void seekdir(DIR* dp, Clong_t pos);
  57. Clong_t telldir(DIR* dp);
  58. // Network
  59. alias uint mode_t;
  60. alias int pid_t;
  61. alias uint uid_t;
  62. alias uint gid_t;
  63. alias Clong_t off_t;
  64. alias Clong_t ssize_t;
  65. struct hostent
  66. {
  67. char* h_name;
  68. char** h_aliases;
  69. int h_addrtype;
  70. int h_length;
  71. char** h_addr_list;
  72. char* h_addr()
  73. {
  74. return h_addr_list[0];
  75. }
  76. }
  77. struct addrinfo { }
  78. struct passwd
  79. {
  80. char* pw_name;
  81. char* pw_passwd;
  82. uint pw_uid;
  83. uint pw_gid;
  84. char* pw_gecos;
  85. char* pw_dir;
  86. char* pw_shell;
  87. }
  88. struct in_addr
  89. {
  90. uint s_addr;
  91. }
  92. struct timespec
  93. {
  94. Clong_t tv_sec;
  95. Clong_t tv_nsec;
  96. }
  97. struct timeval
  98. {
  99. Clong_t tv_sec;
  100. Clong_t tv_usec;
  101. }
  102. struct timezone
  103. {
  104. int tz_minuteswest;
  105. int tz_dsttime;
  106. }
  107. struct sem_t
  108. {
  109. byte[32] __opaque;
  110. }
  111. alias ulong pthread_t;
  112. struct pthread_attr_t
  113. {
  114. byte[56] __opaque;
  115. }
  116. struct pthread_cond_t
  117. {
  118. byte[48] __opaque;
  119. }
  120. struct pthread_condattr_t
  121. {
  122. byte[4] __opaque;
  123. }
  124. struct pthread_mutex_t
  125. {
  126. byte[40] __opaque;
  127. }
  128. struct pthread_mutexattr_t
  129. {
  130. byte[4] __opaque;
  131. }
  132. struct sched_param
  133. {
  134. int sched_priority;
  135. }
  136. struct pthread_barrier_t
  137. {
  138. byte[32] __opaque;
  139. }
  140. struct pthread_barrierattr_t
  141. {
  142. byte[4] __opaque;
  143. }
  144. struct pthread_rwlock_t
  145. {
  146. byte[56] __opaque;
  147. }
  148. struct pthread_rwlockattr_t
  149. {
  150. byte[8] __opaque;
  151. }
  152. alias int pthread_spinlock_t;
  153. enum
  154. {
  155. PTHREAD_CANCEL_DEFERRED = 0,
  156. PTHREAD_CANCEL_ASYNCHRONOUS = 1,
  157. PTHREAD_CANCEL_ENABLE = 0,
  158. PTHREAD_CANCEL_DISABLE = 1,
  159. }
  160. //alias int clockid_t;
  161. struct utimbuf
  162. {
  163. long actime;
  164. long modtime;
  165. }
  166. align(2) struct struct_stat
  167. {
  168. version(darwin) {
  169. uint st_dev;
  170. uint st_ino;
  171. ushort st_mode;
  172. ushort st_nlink;
  173. uint st_uid;
  174. uint st_gid;
  175. uint st_rdev;
  176. ulong[64] fuck;
  177. }
  178. else version(linux) {
  179. ulong st_dev;
  180. version(X86) {
  181. ubyte[4] __pad1;
  182. uint __st_ino;
  183. uint st_mode;
  184. uint st_nlink;
  185. } else version(X86_64) {
  186. ulong st_ino;
  187. ulong st_nlink;
  188. uint st_mode;
  189. } else {
  190. static assert(false); // Unsupported architecture.
  191. }
  192. uint st_uid;
  193. uint st_gid;
  194. version(X86_64)
  195. ubyte[4] __pad0;
  196. ulong st_rdev;
  197. version(X86)
  198. ubyte[4] __pad2;
  199. long st_size;
  200. Clong_t st_blksize;
  201. long st_blocks;
  202. timespec st_atim;
  203. timespec st_mtim;
  204. timespec st_ctim;
  205. version(X86) {
  206. ulong st_ino;
  207. } else version (X86_64){
  208. ubyte[24] __unused;
  209. }
  210. }
  211. else {
  212. static assert(false); // Unsupported OS.
  213. }
  214. }
  215. const auto S_IFMT = 0170000;
  216. const auto S_IFSOCK = 0140000;
  217. const auto S_IFLNK = 0120000;
  218. const auto S_IFREG = 0100000;
  219. const auto S_IFBLK = 0060000;
  220. const auto S_IFDIR = 0040000;
  221. const auto S_IFCHR = 0020000;
  222. const auto S_IFIFO = 0010000;
  223. const auto S_ISUID = 0004000;
  224. const auto S_ISGID = 0002000;
  225. const auto S_ISVTX = 0001000;
  226. bool S_ISLNK(uint mode) {
  227. return (mode & S_IFMT) == S_IFLNK;
  228. }
  229. bool S_ISREG(uint mode) {
  230. return (mode & S_IFMT) == S_IFREG;
  231. }
  232. bool S_ISDIR(uint mode) {
  233. return ((mode & S_IFMT) & S_IFDIR) == S_IFDIR;
  234. }
  235. bool S_ISCHR(uint mode) {
  236. return (mode & S_IFMT) == S_IFCHR;
  237. }
  238. bool S_ISBLK(uint mode) {
  239. return (mode & S_IFMT) == S_IFBLK;
  240. }
  241. bool S_ISFIFO(uint mode) {
  242. return (mode & S_IFMT) == S_IFIFO;
  243. }
  244. bool S_ISSOCK(uint mode) {
  245. return (mode & S_IFMT) == S_IFSOCK;
  246. }
  247. struct sigaction_t {
  248. union {
  249. extern(C) void function(int) sa_handler;
  250. extern(C) void function(int, siginfo_t *, void *) sa_sigaction;
  251. }
  252. sigset_t sa_mask;
  253. int sa_flags;
  254. ubyte[12] __pad1;
  255. }
  256. struct sockaddr {
  257. ushort sa_family;
  258. byte[14] sa_data;
  259. }
  260. struct fd_set {
  261. byte[128] __opaque;
  262. }
  263. enum
  264. {
  265. AF_MAX = 34,
  266. AF_APPLETALK = 5,
  267. AF_INET6 = 10,
  268. AF_NETLINK = 16,
  269. AF_FILE = 1,
  270. AF_ROSE = 11,
  271. AF_NETROM = 6,
  272. AF_ATMPVC = 8,
  273. AF_WANPIPE = 25,
  274. AF_UNSPEC = 0,
  275. AF_BRIDGE = 7,
  276. AF_X25 = 9,
  277. AF_BLUETOOTH = 31,
  278. AF_ROUTE = 16,
  279. AF_SECURITY = 14,
  280. AF_RXRPC = 33,
  281. AF_AX25 = 3,
  282. AF_KEY = 15,
  283. AF_IUCV = 32,
  284. AF_ECONET = 19,
  285. AF_INET = 2,
  286. AF_ATMSVC = 20,
  287. AF_PPPOX = 24,
  288. AF_PACKET = 17,
  289. AF_IRDA = 23,
  290. AF_NETBEUI = 13,
  291. AF_SNA = 22,
  292. AF_LOCAL = 1,
  293. AF_ASH = 18,
  294. AF_UNIX = 1,
  295. AF_DECnet = 12,
  296. AF_IPX = 4,
  297. }
  298. struct sockaddr_in
  299. {
  300. ushort sin_family = AF_INET;
  301. ushort sin_port;
  302. in_addr sin_addr;
  303. ubyte[8] sin_zero;
  304. }
  305. struct protoent
  306. {
  307. char* p_name;
  308. char** p_aliases;
  309. int p_proto;
  310. ubyte[4] __pad1;
  311. }
  312. struct servent
  313. {
  314. char* s_name;
  315. char** s_aliases;
  316. int s_port;
  317. ubyte[4] __pad1;
  318. char* s_proto;
  319. }
  320. alias uint socklen_t;
  321. enum
  322. {
  323. SOL_ATM = 264,
  324. SOL_PACKET = 263,
  325. SOL_IPV6 = 41,
  326. SOL_DECNET = 261,
  327. SOL_X25 = 262,
  328. SOL_IP = 0,
  329. SOL_ICMPV6 = 58,
  330. SOL_SOCKET = 1,
  331. SOL_TCP = 6,
  332. SOL_RAW = 255,
  333. SOL_IRDA = 266,
  334. SOL_AAL = 265,
  335. }
  336. struct sigset_t
  337. {
  338. byte[128] __opaque;
  339. }
  340. //alias extern(C) void function(int) __sighandler_t;
  341. const __sighandler_t SIG_DFL = cast(__sighandler_t) 0;
  342. const __sighandler_t SIG_IGN = cast(__sighandler_t) 1;
  343. const __sighandler_t SIG_ERR = cast(__sighandler_t) 0xffffffffffffffffUL;
  344. struct siginfo_t
  345. {
  346. int si_signo;
  347. int si_errno;
  348. int si_code;
  349. ubyte[116] __pad1;
  350. }
  351. version(X86) {
  352. version(linux) {
  353. version = stat64;
  354. }
  355. }
  356. version(stat64) {
  357. extern (C) int fstat64(int, struct_stat*);
  358. extern (C) int lstat64(in char*, struct_stat*);
  359. extern (C) int stat64(in char*, struct_stat*);
  360. int fstat(int f, struct_stat* s) {
  361. return fstat64(f, s);
  362. }
  363. int lstat(in char* f, struct_stat* s) {
  364. return lstat64(f, s);
  365. }
  366. int stat(in char* f, struct_stat* s) {
  367. return stat64(f, s);
  368. }
  369. } else {
  370. extern (C) int fstat(int, struct_stat*);
  371. extern (C) int lstat(in char*, struct_stat*);
  372. extern (C) int stat(in char*, struct_stat*);
  373. }
  374. extern (C):
  375. // DMD linux.d has dirent.h declarations
  376. //public import std.c.dirent;
  377. //int dirfd(DIR*);
  378. //public import std.c.stdio;
  379. int fseeko(FILE*, off_t, int);
  380. off_t ftello(FILE*);
  381. int open(in char*, int, ...);
  382. ssize_t read(int, void*, size_t);
  383. ssize_t write(int, in void*, size_t);
  384. int close(int);
  385. off_t lseek(int, off_t, int);
  386. int access(in char *path, int mode);
  387. int utime(char *path, utimbuf *buf);
  388. int chmod(in char *, mode_t);
  389. int chdir(in char*);
  390. int mkdir(in char*, mode_t);
  391. int rmdir(in char*);
  392. char* getcwd(char*, size_t);
  393. pid_t fork();
  394. int dup(int);
  395. int dup2(int, int);
  396. int pipe(int[2]);
  397. pid_t wait(int*);
  398. pid_t waitpid(pid_t, int*, int);
  399. int kill(pid_t, int);
  400. int gettimeofday(timeval*, void*);
  401. int settimeofday(in timeval *, in void *);
  402. time_t time(time_t*);
  403. //tm *localtime(time_t*);
  404. int sem_init (sem_t *, int, uint);
  405. int sem_destroy (sem_t *);
  406. sem_t * sem_open (char *, int, ...);
  407. int sem_close(sem_t *);
  408. int sem_wait(sem_t*);
  409. int sem_post(sem_t*);
  410. int sem_trywait(sem_t*);
  411. int sem_getvalue(sem_t*, int*);
  412. int sigemptyset(sigset_t*);
  413. int sigfillset(sigset_t*);
  414. int sigdelset(sigset_t*, int);
  415. int sigismember(sigset_t *set, int);
  416. int sigaction(int, sigaction_t*, sigaction_t*);
  417. int sigsuspend(sigset_t*);
  418. //Clong_t sysconf(int name);
  419. // version ( Unix_Pthread )...
  420. int pthread_attr_init(pthread_attr_t *);
  421. int pthread_attr_destroy(pthread_attr_t *);
  422. int pthread_attr_setdetachstate(pthread_attr_t *, int);
  423. int pthread_attr_getdetachstate(pthread_attr_t *, int *);
  424. int pthread_attr_setguardsize(pthread_attr_t*, size_t);
  425. int pthread_attr_getguardsize(pthread_attr_t*, size_t *);
  426. int pthread_attr_setinheritsched(pthread_attr_t *, int);
  427. int pthread_attr_getinheritsched(pthread_attr_t *, int *);
  428. int pthread_attr_setschedparam(pthread_attr_t *, sched_param *);
  429. int pthread_attr_getschedparam(pthread_attr_t *, sched_param *);
  430. int pthread_attr_setschedpolicy(pthread_attr_t *, int);
  431. int pthread_attr_getschedpolicy(pthread_attr_t *, int*);
  432. int pthread_attr_setscope(pthread_attr_t *, int);
  433. int pthread_attr_getscope(pthread_attr_t *, int*);
  434. int pthread_attr_setstack(pthread_attr_t *, void*, size_t);
  435. int pthread_attr_getstack(pthread_attr_t *, void**, size_t *);
  436. int pthread_attr_setstackaddr(pthread_attr_t *, void *);
  437. int pthread_attr_getstackaddr(pthread_attr_t *, void **);
  438. int pthread_attr_setstacksize(pthread_attr_t *, size_t);
  439. int pthread_attr_getstacksize(pthread_attr_t *, size_t *);
  440. int pthread_create(pthread_t*, pthread_attr_t*, void* (*)(void*), void*);
  441. int pthread_join(pthread_t, void**);
  442. int pthread_kill(pthread_t, int);
  443. pthread_t pthread_self();
  444. int pthread_equal(pthread_t, pthread_t);
  445. int pthread_suspend_np(pthread_t);
  446. int pthread_continue_np(pthread_t);
  447. int pthread_cancel(pthread_t);
  448. int pthread_setcancelstate(int state, int *oldstate);
  449. int pthread_setcanceltype(int type, int *oldtype);
  450. void pthread_testcancel();
  451. int pthread_detach(pthread_t);
  452. void pthread_exit(void*);
  453. int pthread_getattr_np(pthread_t, pthread_attr_t*);
  454. int pthread_getconcurrency();
  455. int pthread_getcpuclockid(pthread_t, clockid_t*);
  456. int pthread_cond_init(pthread_cond_t *, pthread_condattr_t *);
  457. int pthread_cond_destroy(pthread_cond_t *);
  458. int pthread_cond_signal(pthread_cond_t *);
  459. int pthread_cond_broadcast(pthread_cond_t *);
  460. int pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);
  461. int pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *, timespec *);
  462. int pthread_condattr_init(pthread_condattr_t *);
  463. int pthread_condattr_destroy(pthread_condattr_t *);
  464. int pthread_condattr_getpshared(pthread_condattr_t *, int *);
  465. int pthread_condattr_setpshared(pthread_condattr_t *, int);
  466. int pthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);
  467. int pthread_mutex_lock(pthread_mutex_t *);
  468. int pthread_mutex_trylock(pthread_mutex_t *);
  469. int pthread_mutex_unlock(pthread_mutex_t *);
  470. int pthread_mutex_destroy(pthread_mutex_t *);
  471. int pthread_mutexattr_init(pthread_mutexattr_t *);
  472. int pthread_mutexattr_destroy(pthread_mutexattr_t *);
  473. int pthread_mutexattr_getpshared(pthread_mutexattr_t *, int *);
  474. int pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);
  475. int pthread_barrierattr_init(pthread_barrierattr_t*);
  476. int pthread_barrierattr_getpshared(pthread_barrierattr_t*, int*);
  477. int pthread_barrierattr_destroy(pthread_barrierattr_t*);
  478. int pthread_barrierattr_setpshared(pthread_barrierattr_t*, int);
  479. int pthread_barrier_init(pthread_barrier_t*, pthread_barrierattr_t*, uint);
  480. int pthread_barrier_destroy(pthread_barrier_t*);
  481. int pthread_barrier_wait(pthread_barrier_t*);
  482. // version ( Unix_Sched )
  483. void sched_yield();
  484. // from <sys/mman.h>
  485. void* mmap(void* addr, size_t len, int prot, int flags, int fd, off_t offset);
  486. int munmap(void* addr, size_t len);
  487. int msync(void* start, size_t length, int flags);
  488. int madvise(void*, size_t, int);
  489. int mlock(void*, size_t);
  490. int munlock(void*, size_t);
  491. int mlockall(int);
  492. int munlockall();
  493. //void* mremap(void*, size_t, size_t, Culong_t); // Linux specific
  494. int mincore(void*, size_t, ubyte*);
  495. int remap_file_pages(void*, size_t, int, ssize_t, int); // Linux specific
  496. int shm_open(in char*, int, mode_t);
  497. int shm_unlink(in char*);
  498. // from <fcntl.h>
  499. int fcntl(int fd, int cmd, ...);
  500. int select(int n, fd_set *, fd_set *, fd_set *, timeval *);
  501. // could probably rewrite fd_set stuff in D, but for now...
  502. private void _d_gnu_fd_set(int n, fd_set * p);
  503. private void _d_gnu_fd_clr(int n, fd_set * p);
  504. private int _d_gnu_fd_isset(int n, fd_set * p);
  505. private void _d_gnu_fd_copy(fd_set * f, fd_set * t);
  506. private void _d_gnu_fd_zero(fd_set * p);
  507. // maybe these should go away in favor of fd_set methods
  508. /*version (none)
  509. {
  510. void FD_SET(int n, inout fd_set p) { return _d_gnu_fd_set(n, & p); }
  511. void FD_CLR(int n, inout fd_set p) { return _d_gnu_fd_clr(n, & p); }
  512. int FD_ISSET(int n, inout fd_set p) { return _d_gnu_fd_isset(n, & p); }
  513. void FD_COPY(inout fd_set f, inout fd_set t) { return _d_gnu_fd_copy(& f, & t); }
  514. void FD_ZERO(inout fd_set p) { return _d_gnu_fd_zero(& p); }
  515. }*/
  516. /*void FD_SET(int n, fd_set * p) { return _d_gnu_fd_set(n, p); }
  517. void FD_CLR(int n, fd_set * p) { return _d_gnu_fd_clr(n, p); }
  518. int FD_ISSET(int n, fd_set * p) { return _d_gnu_fd_isset(n, p); }
  519. void FD_COPY(fd_set * f, inout fd_set * t) { return _d_gnu_fd_copy(f, t); }
  520. void FD_ZERO(fd_set * p) { return _d_gnu_fd_zero(p); }*/
  521. //void FD_SET(int, fd_set*p);
  522. // from <pwd.h>
  523. passwd *getpwnam(in char *name);
  524. passwd *getpwuid(uid_t uid);
  525. int getpwnam_r(char *name, passwd *pwbuf, char *buf, size_t buflen, passwd **pwbufp);
  526. int getpwuid_r(uid_t uid, passwd *pwbuf, char *buf, size_t buflen, passwd **pwbufp);
  527. // std/socket.d
  528. enum: int
  529. {
  530. SD_RECEIVE = 0,
  531. SD_SEND = 1,
  532. SD_BOTH = 2,
  533. }
  534. int socket(int af, int type, int protocol);
  535. int bind(int s, sockaddr* name, int namelen);
  536. int connect(int s, sockaddr* name, int namelen);
  537. int listen(int s, int backlog);
  538. int accept(int s, sockaddr* addr, int* addrlen);
  539. int shutdown(int s, int how);
  540. int getpeername(int s, sockaddr* name, int* namelen);
  541. int getsockname(int s, sockaddr* name, int* namelen);
  542. ssize_t send(int s, void* buf, size_t len, int flags);
  543. ssize_t sendto(int s, void* buf, size_t len, int flags, sockaddr* to, int tolen);
  544. ssize_t recv(int s, void* buf, size_t len, int flags);
  545. ssize_t recvfrom(int s, void* buf, size_t len, int flags, sockaddr* from, int* fromlen);
  546. int getsockopt(int s, int level, int optname, void* optval, int* optlen);
  547. int setsockopt(int s, int level, int optname, void* optval, int optlen);
  548. uint inet_addr(char* cp);
  549. char* inet_ntoa(in_addr ina);
  550. hostent* gethostbyname(char* name);
  551. int gethostbyname_r(char* name, hostent* ret, void* buf, size_t buflen, hostent** result, int* h_errnop);
  552. int gethostbyname2_r(char* name, int af, hostent* ret, void* buf, size_t buflen, hostent** result, int* h_errnop);
  553. hostent* gethostbyaddr(void* addr, int len, int type);
  554. protoent* getprotobyname(char* name);
  555. protoent* getprotobynumber(int number);
  556. servent* getservbyname(char* name, char* proto);
  557. servent* getservbyport(int port, char* proto);
  558. int gethostname(char* name, int namelen);
  559. int getaddrinfo(char* nodename, char* servname, addrinfo* hints, addrinfo** res);
  560. void freeaddrinfo(addrinfo* ai);
  561. int getnameinfo(sockaddr* sa, socklen_t salen, char* node, socklen_t nodelen, char* service, socklen_t servicelen, int flags);
  562. int htonl(int x);
  563. short htons(int x);
  564. //private import std.stdint;
  565. /*version(BigEndian)
  566. {
  567. uint16_t htons(uint16_t x)
  568. {
  569. return x;
  570. }
  571. uint32_t htonl(uint32_t x)
  572. {
  573. return x;
  574. }
  575. }
  576. else version(LittleEndian)
  577. {
  578. private import std.intrinsic;
  579. uint16_t htons(uint16_t x)
  580. {
  581. return (x >> 8) | (x << 8);
  582. }
  583. uint32_t htonl(uint32_t x)
  584. {
  585. return bswap(x);
  586. }
  587. }
  588. else
  589. {
  590. static assert(0);
  591. }*/
  592. //alias htons ntohs;
  593. //alias htonl ntohl;
  594. // from <time.h>
  595. //char* asctime_r(in tm* t, char* buf);
  596. char* ctime_r(in time_t* timep, char* buf);
  597. //tm* gmtime_r(in time_t* timep, tm* result);
  598. //tm* localtime_r(in time_t* timep, tm* result);
  599. // misc.
  600. uint alarm(uint);
  601. char* basename(char*);
  602. //wint_t btowc(int);
  603. int chown(in char*, uid_t, gid_t);
  604. int chroot(in char*);
  605. size_t confstr(int, char*, size_t);
  606. int creat(in char*, mode_t);
  607. char* ctermid(char*);
  608. char* dirname(char*);
  609. int fattach(int, char*);
  610. int fchmod(int, mode_t);
  611. int fdatasync(int);
  612. int ffs(int);
  613. int fmtmsg(int, char*, int, char*, char*, char*);
  614. int fpathconf(int, int);
  615. extern char** environ;
  616. // unix common somehow missing from phobos
  617. alias int clockid_t;
  618. alias void* timer_t;
  619. alias int time_t;
  620. alias int __pid_t;
  621. //struct timespec {
  622. // time_t tv_sec; /* Seconds. */
  623. // int tv_nsec; /* Nanoseconds. */
  624. //};//
  625. struct itimerspec {
  626. timespec it_interval;
  627. timespec it_value;
  628. };
  629. const auto SIGEV_SIGNAL = 0; /* notify via signal */
  630. const auto SIGEV_NONE = 1; /* other notification: meaningless */
  631. const auto SIGEV_THREAD = 2; /* deliver via thread creation */
  632. union sigval {
  633. int sival_int; /* integer value */
  634. void *sival_ptr; /* pointer value */
  635. }
  636. const int __SIGEV_PAD_SIZE = 13;
  637. // signals
  638. alias void function(int) sighandler_t;
  639. extern(C)
  640. sighandler_t signal(int signum, sighandler_t handler);
  641. enum
  642. {
  643. SIGHUP = 1,
  644. SIGINT,
  645. SIGQUIT,
  646. SIGILL,
  647. SIGTRAP,
  648. SIGABRT,
  649. SIGBUS,
  650. SIGFPE,
  651. SIGKILL,
  652. SIGUSR1,
  653. SIGSEGV,
  654. SIGUSR2,
  655. SIGPIPE,
  656. SIGALRM,
  657. SIGTERM,
  658. SIGSTKFLT,
  659. SIGCHLD,
  660. SIGCONT,
  661. SIGSTOP,
  662. SIGTSTP,
  663. SIGTTIN,
  664. SIGTTOU,
  665. SIGURG,
  666. SIGXCPU,
  667. SIGXFSZ,
  668. SIGVALRM,
  669. SIGPROF,
  670. SIGWINCH,
  671. SIGIO
  672. }
  673. /* c_iflag bits */
  674. const auto IGNBRK = 0000001;
  675. const auto BRKINT = 0000002;
  676. const auto IGNPAR = 0000004;
  677. const auto PARMRK = 0000010;
  678. const auto INPCK = 0000020;
  679. const auto ISTRIP = 0000040;
  680. const auto INLCR = 0000100;
  681. const auto IGNCR = 0000200;
  682. const auto ICRNL = 0000400;
  683. const auto IUCLC = 0001000;
  684. const auto IXON = 0002000;
  685. const auto IXANY = 0004000;
  686. const auto IXOFF = 0010000;
  687. const auto IMAXBEL = 0020000;
  688. const auto IUTF8 = 0040000;
  689. /* c_lflag bits */
  690. const auto ISIG = 0000001;
  691. const auto ICANON = 0000002;
  692. const auto XCASE = 0000004;
  693. const auto ECHO = 0000010;
  694. const auto ECHOE = 0000020;
  695. const auto ECHOK = 0000040;
  696. const auto ECHONL = 0000100;
  697. const auto NOFLSH = 0000200;
  698. const auto TOSTOP = 0000400;
  699. const auto ECHOCTL = 0001000;
  700. const auto ECHOPRT = 0002000;
  701. const auto ECHOKE = 0004000;
  702. const auto FLUSHO = 0010000;
  703. const auto PENDIN = 0040000;
  704. const auto IEXTEN = 0100000;
  705. struct sigevent_sigev_un_sigev_thread
  706. {
  707. void function (sigval) _function; /* Function to start. */
  708. void* _attribute; /* Really pthread_attr_t. */
  709. }
  710. union sigevent_sigev_un
  711. {
  712. int _pad[__SIGEV_PAD_SIZE];
  713. /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the
  714. thread to receive the signal. */
  715. __pid_t _tid;
  716. sigevent_sigev_un_sigev_thread _sigev_thread;
  717. }
  718. struct sigevent
  719. {
  720. sigval sigev_value;
  721. int sigev_signo;
  722. int sigev_notify;
  723. sigevent_sigev_un _sigev_un;
  724. }
  725. /+
  726. struct sigevent {
  727. int sigev_notify; /* notification mode */
  728. int sigev_signo; /* signal number */
  729. sigval sigev_value; /* signal value */
  730. void function(sigval) sigev_notify_function;
  731. pthread_attr_t *sigev_notify_attributes;
  732. int __sigev_pad2;
  733. }
  734. +/
  735. enum:uint
  736. {
  737. STDIN = 0,
  738. STDOUT = 1,
  739. STDERR = 2
  740. }
  741. alias ubyte cc_t;
  742. alias uint speed_t;
  743. alias uint tcflag_t;
  744. const auto NCCS = 19;
  745. struct termios {
  746. tcflag_t c_iflag; /* input mode flags */
  747. tcflag_t c_oflag; /* output mode flags */
  748. tcflag_t c_cflag; /* control mode flags */
  749. tcflag_t c_lflag; /* local mode flags */
  750. cc_t c_line; /* line discipline */
  751. cc_t c_cc[NCCS]; /* control characters */
  752. }
  753. extern(C)
  754. char *setlocale(int category, char *locale);
  755. extern(C)
  756. int timer_create(clockid_t clockid, sigevent* evp,
  757. timer_t *timerid);
  758. extern(C)
  759. int timer_delete(timer_t timerid);
  760. extern(C)
  761. int timer_settime(timer_t timerid, int flags,
  762. itimerspec* value, itimerspec* ovalue);
  763. extern(C)
  764. int nanosleep(timespec* rqtp, timespec* rmtp);
  765. extern (C)
  766. int ioctl (int, uint, ...);
  767. alias void function(int) __sighandler_t;
  768. extern(C) __sighandler_t sigset (int, __sighandler_t);
  769. const int CLOCK_REALTIME = 0;
  770. enum:int
  771. {
  772. LC_CTYPE = 0,
  773. LC_NUMERIC = 1,
  774. LC_TIME = 2,
  775. LC_COLLATE = 3,
  776. LC_MONETARY = 4,
  777. LC_MESSAGES = 5,
  778. LC_ALL = 6,
  779. LC_PAPER = 7,
  780. LC_NAME = 8,
  781. LC_ADDRESS = 9,
  782. LC_TELEPHONE = 10,
  783. LC_MEASUREMENT = 11,
  784. LC_IDENTIFICATION = 12,
  785. }
  786. /* 0x54 is just a magic number to make these relatively unique ('T') */
  787. const auto TCGETS = 0x5401;
  788. const auto TCSETS = 0x5402; /* Clashes with SNDCTL_TMR_START sound ioctl */
  789. const auto TCSETSW = 0x5403;
  790. const auto TCSETSF = 0x5404;
  791. const auto TCGETA = 0x5405;
  792. const auto TCSETA = 0x5406;
  793. const auto TCSETAW = 0x5407;
  794. const auto TCSETAF = 0x5408;
  795. const auto TCSBRK = 0x5409;
  796. const auto TCXONC = 0x540A;
  797. const auto TCFLSH = 0x540B;
  798. const auto TIOCEXCL = 0x540C;
  799. const auto TIOCNXCL = 0x540D;
  800. const auto TIOCSCTTY = 0x540E;
  801. const auto TIOCGPGRP = 0x540F;
  802. const auto TIOCSPGRP = 0x5410;
  803. const auto TIOCOUTQ = 0x5411;
  804. const auto TIOCSTI = 0x5412;
  805. const auto TIOCGWINSZ = 0x5413;
  806. const auto TIOCSWINSZ = 0x5414;
  807. const auto TIOCMGET = 0x5415;
  808. const auto TIOCMBIS = 0x5416;
  809. const auto TIOCMBIC = 0x5417;
  810. const auto TIOCMSET = 0x5418;
  811. const auto TIOCGSOFTCAR = 0x5419;
  812. const auto TIOCSSOFTCAR = 0x541A;
  813. const auto FIONREAD = 0x541B;
  814. const auto TIOCINQ = FIONREAD;
  815. const auto TIOCLINUX = 0x541C;
  816. const auto TIOCCONS = 0x541D;
  817. const auto TIOCGSERIAL = 0x541E;
  818. const auto TIOCSSERIAL = 0x541F;
  819. const auto TIOCPKT = 0x5420;
  820. const auto FIONBIO = 0x5421;
  821. const auto TIOCNOTTY = 0x5422;
  822. const auto TIOCSETD = 0x5423;
  823. const auto TIOCGETD = 0x5424;
  824. const auto TCSBRKP = 0x5425; /* Needed for POSIX tcsendbreak() */
  825. /* const auto TIOCTTYGSTRUCT 0x5426 - Former debugging-only ioctl */
  826. const auto TIOCSBRK = 0x5427; /* BSD compatibility */
  827. const auto TIOCCBRK = 0x5428; /* BSD compatibility */
  828. const auto TIOCGSID = 0x5429; /* Return the session ID of FD */
  829. //const auto TIOCGPTN _IOR('T',0x30, unsigned int) /* Get Pty Number (of pty-mux device) */
  830. //const auto TIOCSPTLCK _IOW('T',0x31, int) /* Lock/unlock Pty */
  831. const auto FIONCLEX = 0x5450;
  832. const auto FIOCLEX = 0x5451;
  833. const auto FIOASYNC = 0x5452;
  834. const auto TIOCSERCONFIG = 0x5453;
  835. const auto TIOCSERGWILD = 0x5454;
  836. const auto TIOCSERSWILD = 0x5455;
  837. const auto TIOCGLCKTRMIOS = 0x5456;
  838. const auto TIOCSLCKTRMIOS = 0x5457;
  839. const auto TIOCSERGSTRUCT = 0x5458; /* For debugging only */
  840. const auto TIOCSERGETLSR = 0x5459; /* Get line status register */
  841. const auto TIOCSERGETMULTI = 0x545A; /* Get multiport config */
  842. const auto TIOCSERSETMULTI = 0x545B; /* Set multiport config */
  843. const auto TIOCMIWAIT = 0x545C; /* wait for a change on serial input line(s) */
  844. const auto TIOCGICOUNT = 0x545D; /* read serial port __inline__ interrupt counts */
  845. const auto TIOCGHAYESESP = 0x545E; /* Get Hayes ESP configuration */
  846. const auto TIOCSHAYESESP = 0x545F; /* Set Hayes ESP configuration */
  847. const auto FIOQSIZE = 0x5460;
  848. /* Used for packet mode */
  849. const auto TIOCPKT_DATA = 0;
  850. const auto TIOCPKT_FLUSHREAD = 1;
  851. const auto TIOCPKT_FLUSHWRITE = 2;
  852. const auto TIOCPKT_STOP = 4;
  853. const auto TIOCPKT_START = 8;
  854. const auto TIOCPKT_NOSTOP = 16;
  855. const auto TIOCPKT_DOSTOP = 32;
  856. const auto TIOCSER_TEMT = 0x01; /* Transmitter physically empty */
  857. enum
  858. {
  859. IPPROTO_IP = 0,
  860. IPPROTO_ROUTING = 43,
  861. IPPROTO_EGP = 8,
  862. IPPROTO_PIM = 103,
  863. IPPROTO_ENCAP = 98,
  864. IPPROTO_ESP = 50,
  865. IPPROTO_PUP = 12,
  866. IPPROTO_IDP = 22,
  867. IPPROTO_IPIP = 4,
  868. IPPROTO_TCP = 6,
  869. IPPROTO_IPV6 = 41,
  870. IPPROTO_SCTP = 132,
  871. IPPROTO_AH = 51,
  872. IPPROTO_MTP = 92,
  873. IPPROTO_TP = 29,
  874. IPPROTO_UDP = 17,
  875. IPPROTO_HOPOPTS = 0,
  876. IPPROTO_RAW = 255,
  877. IPPROTO_ICMP = 1,
  878. IPPROTO_GGP = 3,
  879. IPPROTO_FRAGMENT = 44,
  880. IPPROTO_GRE = 47,
  881. IPPROTO_DSTOPTS = 60,
  882. IPPROTO_NONE = 59,
  883. IPPROTO_RSVP = 46,
  884. IPPROTO_IGMP = 2,
  885. IPPROTO_ICMPV6 = 58,
  886. IPPROTO_COMP = 108,
  887. }
  888. enum
  889. {
  890. IPV6_RTHDR_TYPE_0 = 0,
  891. IPV6_LEAVE_GROUP = 21,
  892. IPV6_PMTUDISC_WANT = 1,
  893. IPV6_NEXTHOP = 9,
  894. IPV6_IPSEC_POLICY = 34,
  895. IPV6_2292HOPOPTS = 3,
  896. IPV6_HOPOPTS = 54,
  897. IPV6_MTU_DISCOVER = 23,
  898. IPV6_AUTHHDR = 10,
  899. IPV6_ADD_MEMBERSHIP = 20,
  900. IPV6_DSTOPTS = 59,
  901. IPV6_2292PKTOPTIONS = 6,
  902. IPV6_RECVHOPOPTS = 53,
  903. IPV6_XFRM_POLICY = 35,
  904. IPV6_RXHOPOPTS = 54,
  905. IPV6_UNICAST_HOPS = 16,
  906. IPV6_ROUTER_ALERT = 22,
  907. IPV6_V6ONLY = 26,
  908. IPV6_RECVRTHDR = 56,
  909. IPV6_RECVHOPLIMIT = 51,
  910. IPV6_RECVTCLASS = 66,
  911. IPV6_RTHDR_STRICT = 1,
  912. IPV6_MTU = 24,
  913. IPV6_RECVDSTOPTS = 58,
  914. IPV6_MULTICAST_IF = 17,
  915. IPV6_RECVERR = 25,
  916. IPV6_RXDSTOPTS = 59,
  917. IPV6_2292PKTINFO = 2,
  918. IPV6_2292DSTOPTS = 4,
  919. IPV6_MULTICAST_HOPS = 18,
  920. IPV6_HOPLIMIT = 52,
  921. IPV6_PMTUDISC_DO = 2,
  922. IPV6_PKTINFO = 50,
  923. IPV6_RTHDRDSTOPTS = 55,
  924. IPV6_JOIN_ANYCAST = 27,
  925. IPV6_TCLASS = 67,
  926. IPV6_2292RTHDR = 5,
  927. IPV6_RTHDR_LOOSE = 0,
  928. IPV6_ADDRFORM = 1,
  929. IPV6_JOIN_GROUP = 20,
  930. IPV6_RTHDR = 57,
  931. IPV6_RECVPKTINFO = 49,
  932. IPV6_DROP_MEMBERSHIP = 21,
  933. IPV6_MULTICAST_LOOP = 19,
  934. IPV6_2292HOPLIMIT = 8,
  935. IPV6_LEAVE_ANYCAST = 28,
  936. IPV6_PMTUDISC_DONT = 0,
  937. IPV6_CHECKSUM = 7,
  938. }
  939. enum : uint
  940. {
  941. INADDR_MAX_LOCAL_GROUP = -536870657,
  942. INADDR_ALLHOSTS_GROUP = -536870911,
  943. INADDR_ANY = 0,
  944. INADDR_UNSPEC_GROUP = -536870912,
  945. INADDR_NONE = -1,
  946. INADDR_ALLRTRS_GROUP = -536870910,
  947. INADDR_LOOPBACK = 2130706433,
  948. INADDR_BROADCAST = -1,
  949. }
  950. enum { ADDR_ANY = INADDR_ANY }
  951. enum
  952. {
  953. TCP_KEEPCNT = 6,
  954. TCP_CONGESTION = 13,
  955. TCP_CORK = 3,
  956. TCP_WINDOW_CLAMP = 10,
  957. TCP_MSS = 512,
  958. TCP_DEFER_ACCEPT = 9,
  959. TCP_KEEPIDLE = 4,
  960. TCP_MD5SIG_MAXKEYLEN = 80,
  961. TCP_MAX_WINSHIFT = 14,
  962. TCP_SYNCNT = 7,
  963. TCP_MAXSEG = 2,
  964. TCP_QUICKACK = 12,
  965. TCP_MAXWIN = 65535,
  966. TCP_KEEPINTVL = 5,
  967. TCP_INFO = 11,
  968. TCP_LINGER2 = 8,
  969. TCP_MD5SIG = 14,
  970. TCP_NODELAY = 1,
  971. }
  972. enum
  973. {
  974. SOCK_RAW = 3,
  975. SOCK_RDM = 4,
  976. SOCK_SEQPACKET = 5,
  977. SOCK_PACKET = 10,
  978. SOCK_DGRAM = 2,
  979. SOCK_STREAM = 1,
  980. }