1 module dpromise.internal.libuv;
2 
3 import deimos.libuv.uv;
4 
5 package(dpromise):
6 
7 package(dpromise) {
8   uv_loop_t* localLoop;
9 }
10 
11 static this() {
12   localLoop = castMalloc!(uv_loop_t);
13   uv_loop_init(localLoop);
14 }
15 
16 static ~this() {
17   uv_loop_close(localLoop);
18 }
19 
20 
21 @nogc nothrow T* castMalloc(T)() {
22   import core.stdc.stdlib : malloc;
23   return cast(T*)malloc(T.sizeof);
24 }
25 
26 nothrow Exception factory(int err, string file = __FILE__, size_t line = __LINE__) {
27   if(err == 0) return null;
28 
29   import std..string : fromStringz;
30   import std.format : format;
31   try {
32     auto msg = format("%s:%s", uv_err_name(err).fromStringz, uv_strerror(err).fromStringz);
33     return new IOException(msg, file, line);
34   } catch(Exception e) {
35     return e;
36   }
37 }
38 
39 
40 /++
41 Errors thrown when libuv error.
42 +/
43 public final class IOException : Exception {
44   /// Creates a new instance of $(D IOException).
45   pure nothrow @nogc @safe this(string msg, string file = __FILE__, size_t line = __LINE__, Throwable next = null) {
46     super(msg, file, line, next);
47   }
48 }
49 
50 version (X86) {
51   enum O_CREAT        = 0x40;     // octal     0100
52   enum O_EXCL         = 0x80;     // octal     0200
53   enum O_NOCTTY       = 0x100;    // octal     0400
54   enum O_TRUNC        = 0x200;    // octal    01000
55 
56   enum O_APPEND       = 0x400;    // octal    02000
57   enum O_NONBLOCK     = 0x800;    // octal    04000
58   enum O_SYNC         = 0x101000; // octal 04010000
59   enum O_DSYNC        = 0x1000;   // octal   010000
60   enum O_RSYNC        = O_SYNC;
61 } else version (X86_64) {
62   enum O_CREAT        = 0x40;     // octal     0100
63   enum O_EXCL         = 0x80;     // octal     0200
64   enum O_NOCTTY       = 0x100;    // octal     0400
65   enum O_TRUNC        = 0x200;    // octal    01000
66 
67   enum O_APPEND       = 0x400;    // octal    02000
68   enum O_NONBLOCK     = 0x800;    // octal    04000
69   enum O_SYNC         = 0x101000; // octal 04010000
70   enum O_DSYNC        = 0x1000;   // octal   010000
71   enum O_RSYNC        = O_SYNC;
72 } else version (MIPS32) {
73   enum O_CREAT        = 0x0100;
74   enum O_EXCL         = 0x0400;
75   enum O_NOCTTY       = 0x0800;
76   enum O_TRUNC        = 0x0200;
77 
78   enum O_APPEND       = 0x0008;
79   enum O_DSYNC        = O_SYNC;
80   enum O_NONBLOCK     = 0x0080;
81   enum O_RSYNC        = O_SYNC;
82   enum O_SYNC         = 0x0010;
83 } else version (MIPS64) {
84   enum O_CREAT        = 0x0100;
85   enum O_EXCL         = 0x0400;
86   enum O_NOCTTY       = 0x0800;
87   enum O_TRUNC        = 0x0200;
88 
89   enum O_APPEND       = 0x0008;
90   enum O_DSYNC        = 0x0010;
91   enum O_NONBLOCK     = 0x0080;
92   enum O_RSYNC        = O_SYNC;
93   enum O_SYNC         = 0x4010;
94 } else version (PPC) {
95   enum O_CREAT        = 0x40;     // octal     0100
96   enum O_EXCL         = 0x80;     // octal     0200
97   enum O_NOCTTY       = 0x100;    // octal     0400
98   enum O_TRUNC        = 0x200;    // octal    01000
99 
100   enum O_APPEND       = 0x400;    // octal    02000
101   enum O_NONBLOCK     = 0x800;    // octal    04000
102   enum O_SYNC         = 0x101000; // octal 04010000
103   enum O_DSYNC        = 0x1000;   // octal   010000
104   enum O_RSYNC        = O_SYNC;
105 } else version (PPC64) {
106   enum O_CREAT        = 0x40;     // octal     0100
107   enum O_EXCL         = 0x80;     // octal     0200
108   enum O_NOCTTY       = 0x100;    // octal     0400
109   enum O_TRUNC        = 0x200;    // octal    010
110 
111   enum O_APPEND       = 0x400;    // octal    02000
112   enum O_NONBLOCK     = 0x800;    // octal    04000
113   enum O_SYNC         = 0x101000; // octal 04010000
114   enum O_DSYNC        = 0x1000;   // octal   010000
115   enum O_RSYNC        = O_SYNC;
116 } else version (ARM) {
117   enum O_CREAT        = 0x40;     // octal     0100
118   enum O_EXCL         = 0x80;     // octal     0200
119   enum O_NOCTTY       = 0x100;    // octal     0400
120   enum O_TRUNC        = 0x200;    // octal    01000
121 
122   enum O_APPEND       = 0x400;    // octal    02000
123   enum O_NONBLOCK     = 0x800;    // octal    04000
124   enum O_SYNC         = 0x101000; // octal 04010000
125   enum O_DSYNC        = 0x1000;   // octal   010000
126   enum O_RSYNC        = O_SYNC;
127 } else version (AArch64) {
128   enum O_CREAT        = 0x40;     // octal     0100
129   enum O_EXCL         = 0x80;     // octal     0200
130   enum O_NOCTTY       = 0x100;    // octal     0400
131   enum O_TRUNC        = 0x200;    // octal    01000
132 
133   enum O_APPEND       = 0x400;    // octal    02000
134   enum O_NONBLOCK     = 0x800;    // octal    04000
135   enum O_SYNC         = 0x101000; // octal 04010000
136   enum O_DSYNC        = 0x1000;   // octal   010000
137   enum O_RSYNC        = O_SYNC;
138 } else version (SystemZ) {
139   enum O_CREAT        = 0x40;     // octal     0100
140   enum O_EXCL         = 0x80;     // octal     0200
141   enum O_NOCTTY       = 0x100;    // octal     0400
142   enum O_TRUNC        = 0x200;    // octal    01000
143 
144   enum O_APPEND       = 0x400;    // octal    02000
145   enum O_NONBLOCK     = 0x800;    // octal    04000
146   enum O_SYNC         = 0x101000; // octal 04010000
147   enum O_DSYNC        = 0x1000;   // octal   010000
148   enum O_RSYNC        = O_SYNC;
149 } else static assert(0, "unimplemented");
150 
151 enum O_ACCMODE      = 0x3;
152 enum O_RDONLY       = 0x0;
153 enum O_WRONLY       = 0x1;
154 enum O_RDWR         = 0x2;
155 
156 
157 enum S_IRUSR    = 0x100; // octal 0400
158 enum S_IWUSR    = 0x080; // octal 0200
159 enum S_IXUSR    = 0x040; // octal 0100
160 enum S_IRWXU    = S_IRUSR | S_IWUSR | S_IXUSR;
161 
162 enum S_IRGRP    = S_IRUSR >> 3;
163 enum S_IWGRP    = S_IWUSR >> 3;
164 enum S_IXGRP    = S_IXUSR >> 3;
165 enum S_IRWXG    = S_IRWXU >> 3;
166 
167 enum S_IROTH    = S_IRGRP >> 3;
168 enum S_IWOTH    = S_IWGRP >> 3;
169 enum S_IXOTH    = S_IXGRP >> 3;
170 enum S_IRWXO    = S_IRWXG >> 3;
171 
172 enum S_ISUID    = 0x800; // octal 04000
173 enum S_ISGID    = 0x400; // octal 02000
174 enum S_ISVTX = 0x200; // octal 01000