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