diff options
Diffstat (limited to 'src/windows_c.zig')
-rw-r--r-- | src/windows_c.zig | 1032 |
1 files changed, 1032 insertions, 0 deletions
diff --git a/src/windows_c.zig b/src/windows_c.zig new file mode 100644 index 000000000..299614579 --- /dev/null +++ b/src/windows_c.zig @@ -0,0 +1,1032 @@ +const std = @import("std"); +const bun = @import("root").bun; +const builtin = @import("builtin"); +const win32 = std.os.windows; +const os = std.os; +const mem = std.mem; +const Stat = std.fs.File.Stat; +const Kind = std.fs.File.Kind; +const StatError = std.fs.File.StatError; + +pub fn getTotalMemory() usize { + return 0; +} +pub fn getSystemMemory() usize { + return 0; +} + +pub fn getFreeMemory() usize { + return 0; +} + +pub fn getSystemUptime() usize { + return 0; +} + +pub fn getSystemLoadavg() [3]f32 { + return .{ 0, 0, 0 }; +} + +pub const Mode = i32; +const Win32Error = bun.windows.Win32Error; + +// The way we do errors in Bun needs to get cleaned up. +// This is way too complicated. +// The problem is because we use libc in some cases and we use zig's std lib in other places and other times we go direct. +// So we end up with a lot of redundant code. +pub const SystemErrno = enum(u8) { + SUCCESS = 0, + EPERM = 1, + ENOENT = 2, + ESRCH = 3, + EINTR = 4, + EIO = 5, + ENXIO = 6, + E2BIG = 7, + ENOEXEC = 8, + EBADF = 9, + ECHILD = 10, + EAGAIN = 11, + ENOMEM = 12, + EACCES = 13, + EFAULT = 14, + ENOTBLK = 15, + EBUSY = 16, + EEXIST = 17, + EXDEV = 18, + ENODEV = 19, + ENOTDIR = 20, + EISDIR = 21, + EINVAL = 22, + ENFILE = 23, + EMFILE = 24, + ENOTTY = 25, + ETXTBSY = 26, + EFBIG = 27, + ENOSPC = 28, + ESPIPE = 29, + EROFS = 30, + EMLINK = 31, + EPIPE = 32, + EDOM = 33, + ERANGE = 34, + EDEADLK = 35, + ENAMETOOLONG = 36, + ENOLCK = 37, + ENOSYS = 38, + ENOTEMPTY = 39, + ELOOP = 40, + EWOULDBLOCK = 41, + ENOMSG = 42, + EIDRM = 43, + ECHRNG = 44, + EL2NSYNC = 45, + EL3HLT = 46, + EL3RST = 47, + ELNRNG = 48, + EUNATCH = 49, + ENOCSI = 50, + EL2HLT = 51, + EBADE = 52, + EBADR = 53, + EXFULL = 54, + ENOANO = 55, + EBADRQC = 56, + EBADSLT = 57, + EDEADLOCK = 58, + EBFONT = 59, + ENOSTR = 60, + ENODATA = 61, + ETIME = 62, + ENOSR = 63, + ENONET = 64, + ENOPKG = 65, + EREMOTE = 66, + ENOLINK = 67, + EADV = 68, + ESRMNT = 69, + ECOMM = 70, + EPROTO = 71, + EMULTIHOP = 72, + EDOTDOT = 73, + EBADMSG = 74, + EOVERFLOW = 75, + ENOTUNIQ = 76, + EBADFD = 77, + EREMCHG = 78, + ELIBACC = 79, + ELIBBAD = 80, + ELIBSCN = 81, + ELIBMAX = 82, + ELIBEXEC = 83, + EILSEQ = 84, + ERESTART = 85, + ESTRPIPE = 86, + EUSERS = 87, + ENOTSOCK = 88, + EDESTADDRREQ = 89, + EMSGSIZE = 90, + EPROTOTYPE = 91, + ENOPROTOOPT = 92, + EPROTONOSUPPORT = 93, + ESOCKTNOSUPPORT = 94, + /// For Linux, EOPNOTSUPP is the real value + /// but it's ~the same and is incompatible across operating systems + /// https://lists.gnu.org/archive/html/bug-glibc/2002-08/msg00017.html + ENOTSUP = 95, + EPFNOSUPPORT = 96, + EAFNOSUPPORT = 97, + EADDRINUSE = 98, + EADDRNOTAVAIL = 99, + ENETDOWN = 100, + ENETUNREACH = 101, + ENETRESET = 102, + ECONNABORTED = 103, + ECONNRESET = 104, + ENOBUFS = 105, + EISCONN = 106, + ENOTCONN = 107, + ESHUTDOWN = 108, + ETOOMANYREFS = 109, + ETIMEDOUT = 110, + ECONNREFUSED = 111, + EHOSTDOWN = 112, + EHOSTUNREACH = 113, + EALREADY = 114, + EINPROGRESS = 115, + ESTALE = 116, + EUCLEAN = 117, + ENOTNAM = 118, + ENAVAIL = 119, + EISNAM = 120, + EREMOTEIO = 121, + EDQUOT = 122, + ENOMEDIUM = 123, + EMEDIUMTYPE = 124, + ECANCELED = 125, + ENOKEY = 126, + EKEYEXPIRED = 127, + EKEYREVOKED = 128, + EKEYREJECTED = 129, + EOWNERDEAD = 130, + ENOTRECOVERABLE = 131, + ERFKILL = 132, + EHWPOISON = 133, + // made up erropr + EUNKNOWN = 134, + ECHARSET = 135, + EOF = 136, + + pub const max = 137; + + pub const Error = error{ + PERM, + NOENT, + SRCH, + INTR, + IO, + NXIO, + @"2BIG", + NOEXEC, + BADF, + CHILD, + AGAIN, + NOMEM, + ACCES, + FAULT, + NOTBLK, + BUSY, + EXIST, + XDEV, + NODEV, + NOTDIR, + ISDIR, + INVAL, + NFILE, + MFILE, + NOTTY, + TXTBSY, + FBIG, + NOSPC, + SPIPE, + ROFS, + MLINK, + PIPE, + DOM, + RANGE, + DEADLK, + NAMETOOLONG, + NOLCK, + NOSYS, + NOTEMPTY, + LOOP, + WOULDBLOCK, + NOMSG, + IDRM, + CHRNG, + L2NSYNC, + L3HLT, + L3RST, + LNRNG, + UNATCH, + NOCSI, + L2HLT, + BADE, + BADR, + XFULL, + NOANO, + BADRQC, + BADSLT, + DEADLOCK, + BFONT, + NOSTR, + NODATA, + TIME, + NOSR, + NONET, + NOPKG, + REMOTE, + NOLINK, + ADV, + SRMNT, + COMM, + PROTO, + MULTIHOP, + DOTDOT, + BADMSG, + OVERFLOW, + NOTUNIQ, + BADFD, + REMCHG, + LIBACC, + LIBBAD, + LIBSCN, + LIBMAX, + LIBEXEC, + ILSEQ, + RESTART, + STRPIPE, + USERS, + NOTSOCK, + DESTADDRREQ, + MSGSIZE, + PROTOTYPE, + NOPROTOOPT, + PROTONOSUPPORT, + SOCKTNOSUPPORT, + NOTSUP, + PFNOSUPPORT, + AFNOSUPPORT, + ADDRINUSE, + ADDRNOTAVAIL, + NETDOWN, + NETUNREACH, + NETRESET, + CONNABORTED, + CONNRESET, + NOBUFS, + ISCONN, + NOTCONN, + SHUTDOWN, + TOOMANYREFS, + TIMEDOUT, + CONNREFUSED, + HOSTDOWN, + HOSTUNREACH, + ALREADY, + INPROGRESS, + STALE, + UCLEAN, + NOTNAM, + NAVAIL, + ISNAM, + REMOTEIO, + DQUOT, + NOMEDIUM, + MEDIUMTYPE, + CANCELED, + NOKEY, + KEYEXPIRED, + KEYREVOKED, + KEYREJECTED, + OWNERDEAD, + NOTRECOVERABLE, + RFKILL, + HWPOISON, + UNKNOWN, + CHARSET, + OF, + Unexpected, + }; + + pub inline fn toE(this: SystemErrno) E { + return @enumFromInt(@intFromEnum(this)); + } + + const error_map: [SystemErrno.max]Error = brk: { + var errors: [SystemErrno.max]Error = undefined; + errors[@intFromEnum(SystemErrno.EPERM)] = error.PERM; + errors[@intFromEnum(SystemErrno.ENOENT)] = error.NOENT; + errors[@intFromEnum(SystemErrno.ESRCH)] = error.SRCH; + errors[@intFromEnum(SystemErrno.EINTR)] = error.INTR; + errors[@intFromEnum(SystemErrno.EIO)] = error.IO; + errors[@intFromEnum(SystemErrno.ENXIO)] = error.NXIO; + errors[@intFromEnum(SystemErrno.E2BIG)] = error.@"2BIG"; + errors[@intFromEnum(SystemErrno.ENOEXEC)] = error.NOEXEC; + errors[@intFromEnum(SystemErrno.EBADF)] = error.BADF; + errors[@intFromEnum(SystemErrno.ECHILD)] = error.CHILD; + errors[@intFromEnum(SystemErrno.EAGAIN)] = error.AGAIN; + errors[@intFromEnum(SystemErrno.ENOMEM)] = error.NOMEM; + errors[@intFromEnum(SystemErrno.EACCES)] = error.ACCES; + errors[@intFromEnum(SystemErrno.EFAULT)] = error.FAULT; + errors[@intFromEnum(SystemErrno.ENOTBLK)] = error.NOTBLK; + errors[@intFromEnum(SystemErrno.EBUSY)] = error.BUSY; + errors[@intFromEnum(SystemErrno.EEXIST)] = error.EXIST; + errors[@intFromEnum(SystemErrno.EXDEV)] = error.XDEV; + errors[@intFromEnum(SystemErrno.ENODEV)] = error.NODEV; + errors[@intFromEnum(SystemErrno.ENOTDIR)] = error.NOTDIR; + errors[@intFromEnum(SystemErrno.EISDIR)] = error.ISDIR; + errors[@intFromEnum(SystemErrno.EINVAL)] = error.INVAL; + errors[@intFromEnum(SystemErrno.ENFILE)] = error.NFILE; + errors[@intFromEnum(SystemErrno.EMFILE)] = error.MFILE; + errors[@intFromEnum(SystemErrno.ENOTTY)] = error.NOTTY; + errors[@intFromEnum(SystemErrno.ETXTBSY)] = error.TXTBSY; + errors[@intFromEnum(SystemErrno.EFBIG)] = error.FBIG; + errors[@intFromEnum(SystemErrno.ENOSPC)] = error.NOSPC; + errors[@intFromEnum(SystemErrno.ESPIPE)] = error.SPIPE; + errors[@intFromEnum(SystemErrno.EROFS)] = error.ROFS; + errors[@intFromEnum(SystemErrno.EMLINK)] = error.MLINK; + errors[@intFromEnum(SystemErrno.EPIPE)] = error.PIPE; + errors[@intFromEnum(SystemErrno.EDOM)] = error.DOM; + errors[@intFromEnum(SystemErrno.ERANGE)] = error.RANGE; + errors[@intFromEnum(SystemErrno.EDEADLK)] = error.DEADLK; + errors[@intFromEnum(SystemErrno.ENAMETOOLONG)] = error.NAMETOOLONG; + errors[@intFromEnum(SystemErrno.ENOLCK)] = error.NOLCK; + errors[@intFromEnum(SystemErrno.ENOSYS)] = error.NOSYS; + errors[@intFromEnum(SystemErrno.ENOTEMPTY)] = error.NOTEMPTY; + errors[@intFromEnum(SystemErrno.ELOOP)] = error.LOOP; + errors[@intFromEnum(SystemErrno.EWOULDBLOCK)] = error.WOULDBLOCK; + errors[@intFromEnum(SystemErrno.ENOMSG)] = error.NOMSG; + errors[@intFromEnum(SystemErrno.EIDRM)] = error.IDRM; + errors[@intFromEnum(SystemErrno.ECHRNG)] = error.CHRNG; + errors[@intFromEnum(SystemErrno.EL2NSYNC)] = error.L2NSYNC; + errors[@intFromEnum(SystemErrno.EL3HLT)] = error.L3HLT; + errors[@intFromEnum(SystemErrno.EL3RST)] = error.L3RST; + errors[@intFromEnum(SystemErrno.ELNRNG)] = error.LNRNG; + errors[@intFromEnum(SystemErrno.EUNATCH)] = error.UNATCH; + errors[@intFromEnum(SystemErrno.ENOCSI)] = error.NOCSI; + errors[@intFromEnum(SystemErrno.EL2HLT)] = error.L2HLT; + errors[@intFromEnum(SystemErrno.EBADE)] = error.BADE; + errors[@intFromEnum(SystemErrno.EBADR)] = error.BADR; + errors[@intFromEnum(SystemErrno.EXFULL)] = error.XFULL; + errors[@intFromEnum(SystemErrno.ENOANO)] = error.NOANO; + errors[@intFromEnum(SystemErrno.EBADRQC)] = error.BADRQC; + errors[@intFromEnum(SystemErrno.EBADSLT)] = error.BADSLT; + errors[@intFromEnum(SystemErrno.EDEADLOCK)] = error.DEADLOCK; + errors[@intFromEnum(SystemErrno.EBFONT)] = error.BFONT; + errors[@intFromEnum(SystemErrno.ENOSTR)] = error.NOSTR; + errors[@intFromEnum(SystemErrno.ENODATA)] = error.NODATA; + errors[@intFromEnum(SystemErrno.ETIME)] = error.TIME; + errors[@intFromEnum(SystemErrno.ENOSR)] = error.NOSR; + errors[@intFromEnum(SystemErrno.ENONET)] = error.NONET; + errors[@intFromEnum(SystemErrno.ENOPKG)] = error.NOPKG; + errors[@intFromEnum(SystemErrno.EREMOTE)] = error.REMOTE; + errors[@intFromEnum(SystemErrno.ENOLINK)] = error.NOLINK; + errors[@intFromEnum(SystemErrno.EADV)] = error.ADV; + errors[@intFromEnum(SystemErrno.ESRMNT)] = error.SRMNT; + errors[@intFromEnum(SystemErrno.ECOMM)] = error.COMM; + errors[@intFromEnum(SystemErrno.EPROTO)] = error.PROTO; + errors[@intFromEnum(SystemErrno.EMULTIHOP)] = error.MULTIHOP; + errors[@intFromEnum(SystemErrno.EDOTDOT)] = error.DOTDOT; + errors[@intFromEnum(SystemErrno.EBADMSG)] = error.BADMSG; + errors[@intFromEnum(SystemErrno.EOVERFLOW)] = error.OVERFLOW; + errors[@intFromEnum(SystemErrno.ENOTUNIQ)] = error.NOTUNIQ; + errors[@intFromEnum(SystemErrno.EBADFD)] = error.BADFD; + errors[@intFromEnum(SystemErrno.EREMCHG)] = error.REMCHG; + errors[@intFromEnum(SystemErrno.ELIBACC)] = error.LIBACC; + errors[@intFromEnum(SystemErrno.ELIBBAD)] = error.LIBBAD; + errors[@intFromEnum(SystemErrno.ELIBSCN)] = error.LIBSCN; + errors[@intFromEnum(SystemErrno.ELIBMAX)] = error.LIBMAX; + errors[@intFromEnum(SystemErrno.ELIBEXEC)] = error.LIBEXEC; + errors[@intFromEnum(SystemErrno.EILSEQ)] = error.ILSEQ; + errors[@intFromEnum(SystemErrno.ERESTART)] = error.RESTART; + errors[@intFromEnum(SystemErrno.ESTRPIPE)] = error.STRPIPE; + errors[@intFromEnum(SystemErrno.EUSERS)] = error.USERS; + errors[@intFromEnum(SystemErrno.ENOTSOCK)] = error.NOTSOCK; + errors[@intFromEnum(SystemErrno.EDESTADDRREQ)] = error.DESTADDRREQ; + errors[@intFromEnum(SystemErrno.EMSGSIZE)] = error.MSGSIZE; + errors[@intFromEnum(SystemErrno.EPROTOTYPE)] = error.PROTOTYPE; + errors[@intFromEnum(SystemErrno.ENOPROTOOPT)] = error.NOPROTOOPT; + errors[@intFromEnum(SystemErrno.EPROTONOSUPPORT)] = error.PROTONOSUPPORT; + errors[@intFromEnum(SystemErrno.ESOCKTNOSUPPORT)] = error.SOCKTNOSUPPORT; + errors[@intFromEnum(SystemErrno.ENOTSUP)] = error.NOTSUP; + errors[@intFromEnum(SystemErrno.EPFNOSUPPORT)] = error.PFNOSUPPORT; + errors[@intFromEnum(SystemErrno.EAFNOSUPPORT)] = error.AFNOSUPPORT; + errors[@intFromEnum(SystemErrno.EADDRINUSE)] = error.ADDRINUSE; + errors[@intFromEnum(SystemErrno.EADDRNOTAVAIL)] = error.ADDRNOTAVAIL; + errors[@intFromEnum(SystemErrno.ENETDOWN)] = error.NETDOWN; + errors[@intFromEnum(SystemErrno.ENETUNREACH)] = error.NETUNREACH; + errors[@intFromEnum(SystemErrno.ENETRESET)] = error.NETRESET; + errors[@intFromEnum(SystemErrno.ECONNABORTED)] = error.CONNABORTED; + errors[@intFromEnum(SystemErrno.ECONNRESET)] = error.CONNRESET; + errors[@intFromEnum(SystemErrno.ENOBUFS)] = error.NOBUFS; + errors[@intFromEnum(SystemErrno.EISCONN)] = error.ISCONN; + errors[@intFromEnum(SystemErrno.ENOTCONN)] = error.NOTCONN; + errors[@intFromEnum(SystemErrno.ESHUTDOWN)] = error.SHUTDOWN; + errors[@intFromEnum(SystemErrno.ETOOMANYREFS)] = error.TOOMANYREFS; + errors[@intFromEnum(SystemErrno.ETIMEDOUT)] = error.TIMEDOUT; + errors[@intFromEnum(SystemErrno.ECONNREFUSED)] = error.CONNREFUSED; + errors[@intFromEnum(SystemErrno.EHOSTDOWN)] = error.HOSTDOWN; + errors[@intFromEnum(SystemErrno.EHOSTUNREACH)] = error.HOSTUNREACH; + errors[@intFromEnum(SystemErrno.EALREADY)] = error.ALREADY; + errors[@intFromEnum(SystemErrno.EINPROGRESS)] = error.INPROGRESS; + errors[@intFromEnum(SystemErrno.ESTALE)] = error.STALE; + errors[@intFromEnum(SystemErrno.EUCLEAN)] = error.UCLEAN; + errors[@intFromEnum(SystemErrno.ENOTNAM)] = error.NOTNAM; + errors[@intFromEnum(SystemErrno.ENAVAIL)] = error.NAVAIL; + errors[@intFromEnum(SystemErrno.EISNAM)] = error.ISNAM; + errors[@intFromEnum(SystemErrno.EREMOTEIO)] = error.REMOTEIO; + errors[@intFromEnum(SystemErrno.EDQUOT)] = error.DQUOT; + errors[@intFromEnum(SystemErrno.ENOMEDIUM)] = error.NOMEDIUM; + errors[@intFromEnum(SystemErrno.EMEDIUMTYPE)] = error.MEDIUMTYPE; + errors[@intFromEnum(SystemErrno.ECANCELED)] = error.CANCELED; + errors[@intFromEnum(SystemErrno.ENOKEY)] = error.NOKEY; + errors[@intFromEnum(SystemErrno.EKEYEXPIRED)] = error.KEYEXPIRED; + errors[@intFromEnum(SystemErrno.EKEYREVOKED)] = error.KEYREVOKED; + errors[@intFromEnum(SystemErrno.EKEYREJECTED)] = error.KEYREJECTED; + errors[@intFromEnum(SystemErrno.EOWNERDEAD)] = error.OWNERDEAD; + errors[@intFromEnum(SystemErrno.ENOTRECOVERABLE)] = error.NOTRECOVERABLE; + errors[@intFromEnum(SystemErrno.ERFKILL)] = error.RFKILL; + errors[@intFromEnum(SystemErrno.EHWPOISON)] = error.HWPOISON; + errors[@intFromEnum(SystemErrno.EUNKNOWN)] = error.UNKNOWN; + errors[@intFromEnum(SystemErrno.ECHARSET)] = error.CHARSET; + errors[@intFromEnum(SystemErrno.EOF)] = error.OF; + break :brk errors; + }; + + pub fn fromError(err: anyerror) ?SystemErrno { + return switch (err) { + error.PERM => SystemErrno.EPERM, + error.NOENT => SystemErrno.ENOENT, + error.SRCH => SystemErrno.ESRCH, + error.INTR => SystemErrno.EINTR, + error.IO => SystemErrno.EIO, + error.NXIO => SystemErrno.ENXIO, + error.@"2BIG" => SystemErrno.E2BIG, + error.NOEXEC => SystemErrno.ENOEXEC, + error.BADF => SystemErrno.EBADF, + error.CHILD => SystemErrno.ECHILD, + error.AGAIN => SystemErrno.EAGAIN, + error.NOMEM => SystemErrno.ENOMEM, + error.ACCES => SystemErrno.EACCES, + error.FAULT => SystemErrno.EFAULT, + error.NOTBLK => SystemErrno.ENOTBLK, + error.BUSY => SystemErrno.EBUSY, + error.EXIST => SystemErrno.EEXIST, + error.XDEV => SystemErrno.EXDEV, + error.NODEV => SystemErrno.ENODEV, + error.NOTDIR => SystemErrno.ENOTDIR, + error.ISDIR => SystemErrno.EISDIR, + error.INVAL => SystemErrno.EINVAL, + error.NFILE => SystemErrno.ENFILE, + error.MFILE => SystemErrno.EMFILE, + error.NOTTY => SystemErrno.ENOTTY, + error.TXTBSY => SystemErrno.ETXTBSY, + error.FBIG => SystemErrno.EFBIG, + error.NOSPC => SystemErrno.ENOSPC, + error.SPIPE => SystemErrno.ESPIPE, + error.ROFS => SystemErrno.EROFS, + error.MLINK => SystemErrno.EMLINK, + error.PIPE => SystemErrno.EPIPE, + error.DOM => SystemErrno.EDOM, + error.RANGE => SystemErrno.ERANGE, + error.DEADLK => SystemErrno.EDEADLK, + error.NAMETOOLONG => SystemErrno.ENAMETOOLONG, + error.NOLCK => SystemErrno.ENOLCK, + error.NOSYS => SystemErrno.ENOSYS, + error.NOTEMPTY => SystemErrno.ENOTEMPTY, + error.LOOP => SystemErrno.ELOOP, + error.WOULDBLOCK => SystemErrno.EWOULDBLOCK, + error.NOMSG => SystemErrno.ENOMSG, + error.IDRM => SystemErrno.EIDRM, + error.CHRNG => SystemErrno.ECHRNG, + error.L2NSYNC => SystemErrno.EL2NSYNC, + error.L3HLT => SystemErrno.EL3HLT, + error.L3RST => SystemErrno.EL3RST, + error.LNRNG => SystemErrno.ELNRNG, + error.UNATCH => SystemErrno.EUNATCH, + error.NOCSI => SystemErrno.ENOCSI, + error.L2HLT => SystemErrno.EL2HLT, + error.BADE => SystemErrno.EBADE, + error.BADR => SystemErrno.EBADR, + error.XFULL => SystemErrno.EXFULL, + error.NOANO => SystemErrno.ENOANO, + error.BADRQC => SystemErrno.EBADRQC, + error.BADSLT => SystemErrno.EBADSLT, + error.DEADLOCK => SystemErrno.EDEADLOCK, + error.BFONT => SystemErrno.EBFONT, + error.NOSTR => SystemErrno.ENOSTR, + error.NODATA => SystemErrno.ENODATA, + error.TIME => SystemErrno.ETIME, + error.NOSR => SystemErrno.ENOSR, + error.NONET => SystemErrno.ENONET, + error.NOPKG => SystemErrno.ENOPKG, + error.REMOTE => SystemErrno.EREMOTE, + error.NOLINK => SystemErrno.ENOLINK, + error.ADV => SystemErrno.EADV, + error.SRMNT => SystemErrno.ESRMNT, + error.COMM => SystemErrno.ECOMM, + error.PROTO => SystemErrno.EPROTO, + error.MULTIHOP => SystemErrno.EMULTIHOP, + error.DOTDOT => SystemErrno.EDOTDOT, + error.BADMSG => SystemErrno.EBADMSG, + error.OVERFLOW => SystemErrno.EOVERFLOW, + error.NOTUNIQ => SystemErrno.ENOTUNIQ, + error.BADFD => SystemErrno.EBADFD, + error.REMCHG => SystemErrno.EREMCHG, + error.LIBACC => SystemErrno.ELIBACC, + error.LIBBAD => SystemErrno.ELIBBAD, + error.LIBSCN => SystemErrno.ELIBSCN, + error.LIBMAX => SystemErrno.ELIBMAX, + error.LIBEXEC => SystemErrno.ELIBEXEC, + error.ILSEQ => SystemErrno.EILSEQ, + error.RESTART => SystemErrno.ERESTART, + error.STRPIPE => SystemErrno.ESTRPIPE, + error.USERS => SystemErrno.EUSERS, + error.NOTSOCK => SystemErrno.ENOTSOCK, + error.DESTADDRREQ => SystemErrno.EDESTADDRREQ, + error.MSGSIZE => SystemErrno.EMSGSIZE, + error.PROTOTYPE => SystemErrno.EPROTOTYPE, + error.NOPROTOOPT => SystemErrno.ENOPROTOOPT, + error.PROTONOSUPPORT => SystemErrno.EPROTONOSUPPORT, + error.SOCKTNOSUPPORT => SystemErrno.ESOCKTNOSUPPORT, + error.NOTSUP => SystemErrno.ENOTSUP, + error.PFNOSUPPORT => SystemErrno.EPFNOSUPPORT, + error.AFNOSUPPORT => SystemErrno.EAFNOSUPPORT, + error.ADDRINUSE => SystemErrno.EADDRINUSE, + error.ADDRNOTAVAIL => SystemErrno.EADDRNOTAVAIL, + error.NETDOWN => SystemErrno.ENETDOWN, + error.NETUNREACH => SystemErrno.ENETUNREACH, + error.NETRESET => SystemErrno.ENETRESET, + error.CONNABORTED => SystemErrno.ECONNABORTED, + error.CONNRESET => SystemErrno.ECONNRESET, + error.NOBUFS => SystemErrno.ENOBUFS, + error.ISCONN => SystemErrno.EISCONN, + error.NOTCONN => SystemErrno.ENOTCONN, + error.SHUTDOWN => SystemErrno.ESHUTDOWN, + error.TOOMANYREFS => SystemErrno.ETOOMANYREFS, + error.TIMEDOUT => SystemErrno.ETIMEDOUT, + error.CONNREFUSED => SystemErrno.ECONNREFUSED, + error.HOSTDOWN => SystemErrno.EHOSTDOWN, + error.HOSTUNREACH => SystemErrno.EHOSTUNREACH, + error.ALREADY => SystemErrno.EALREADY, + error.INPROGRESS => SystemErrno.EINPROGRESS, + error.STALE => SystemErrno.ESTALE, + error.UCLEAN => SystemErrno.EUCLEAN, + error.NOTNAM => SystemErrno.ENOTNAM, + error.NAVAIL => SystemErrno.ENAVAIL, + error.ISNAM => SystemErrno.EISNAM, + error.REMOTEIO => SystemErrno.EREMOTEIO, + error.DQUOT => SystemErrno.EDQUOT, + error.NOMEDIUM => SystemErrno.ENOMEDIUM, + error.MEDIUMTYPE => SystemErrno.EMEDIUMTYPE, + error.CANCELED => SystemErrno.ECANCELED, + error.NOKEY => SystemErrno.ENOKEY, + error.KEYEXPIRED => SystemErrno.EKEYEXPIRED, + error.KEYREVOKED => SystemErrno.EKEYREVOKED, + error.KEYREJECTED => SystemErrno.EKEYREJECTED, + error.OWNERDEAD => SystemErrno.EOWNERDEAD, + error.NOTRECOVERABLE => SystemErrno.ENOTRECOVERABLE, + error.RFKILL => SystemErrno.ERFKILL, + error.HWPOISON => SystemErrno.EHWPOISON, + error.UNKNOWN => SystemErrno.EUNKNOWN, + error.CHARSET => SystemErrno.ECHARSET, + error.OF => SystemErrno.EOF, + else => return null, + }; + } + pub fn toError(this: SystemErrno) Error { + return error_map[@intFromEnum(this)]; + } + + pub fn init(code: anytype) ?SystemErrno { + if (comptime @TypeOf(code) == u16) { + if (code <= 3950) { + return init(@as(Win32Error, @enumFromInt(code))); + } else { + if (comptime bun.Environment.allow_assert) + bun.Output.debug("Unknown error code: {}\n", .{code}); + + return null; + } + } + + if (comptime @TypeOf(code) == Win32Error) { + return switch (code) { + Win32Error.NOACCESS => SystemErrno.EACCES, + @as(Win32Error, @enumFromInt(10013)) => SystemErrno.EACCES, + Win32Error.ELEVATION_REQUIRED => SystemErrno.EACCES, + Win32Error.CANT_ACCESS_FILE => SystemErrno.EACCES, + Win32Error.ADDRESS_ALREADY_ASSOCIATED => SystemErrno.EADDRINUSE, + Win32Error.WSAEADDRINUSE => SystemErrno.EADDRINUSE, + Win32Error.WSAEADDRNOTAVAIL => SystemErrno.EADDRNOTAVAIL, + Win32Error.WSAEAFNOSUPPORT => SystemErrno.EAFNOSUPPORT, + Win32Error.WSAEWOULDBLOCK => SystemErrno.EAGAIN, + Win32Error.WSAEALREADY => SystemErrno.EALREADY, + Win32Error.INVALID_FLAGS => SystemErrno.EBADF, + Win32Error.INVALID_HANDLE => SystemErrno.EBADF, + Win32Error.LOCK_VIOLATION => SystemErrno.EBUSY, + Win32Error.PIPE_BUSY => SystemErrno.EBUSY, + Win32Error.SHARING_VIOLATION => SystemErrno.EBUSY, + Win32Error.OPERATION_ABORTED => SystemErrno.ECANCELED, + Win32Error.WSAEINTR => SystemErrno.ECANCELED, + Win32Error.NO_UNICODE_TRANSLATION => SystemErrno.ECHARSET, + Win32Error.CONNECTION_ABORTED => SystemErrno.ECONNABORTED, + Win32Error.WSAECONNABORTED => SystemErrno.ECONNABORTED, + Win32Error.CONNECTION_REFUSED => SystemErrno.ECONNREFUSED, + Win32Error.WSAECONNREFUSED => SystemErrno.ECONNREFUSED, + Win32Error.NETNAME_DELETED => SystemErrno.ECONNRESET, + Win32Error.WSAECONNRESET => SystemErrno.ECONNRESET, + Win32Error.ALREADY_EXISTS => SystemErrno.EEXIST, + Win32Error.FILE_EXISTS => SystemErrno.EEXIST, + Win32Error.BUFFER_OVERFLOW => SystemErrno.EFAULT, + Win32Error.WSAEFAULT => SystemErrno.EFAULT, + Win32Error.HOST_UNREACHABLE => SystemErrno.EHOSTUNREACH, + Win32Error.WSAEHOSTUNREACH => SystemErrno.EHOSTUNREACH, + Win32Error.INSUFFICIENT_BUFFER => SystemErrno.EINVAL, + Win32Error.INVALID_DATA => SystemErrno.EINVAL, + Win32Error.INVALID_PARAMETER => SystemErrno.EINVAL, + Win32Error.SYMLINK_NOT_SUPPORTED => SystemErrno.EINVAL, + Win32Error.WSAEINVAL => SystemErrno.EINVAL, + Win32Error.WSAEPFNOSUPPORT => SystemErrno.EINVAL, + Win32Error.BEGINNING_OF_MEDIA => SystemErrno.EIO, + Win32Error.BUS_RESET => SystemErrno.EIO, + Win32Error.CRC => SystemErrno.EIO, + Win32Error.DEVICE_DOOR_OPEN => SystemErrno.EIO, + Win32Error.DEVICE_REQUIRES_CLEANING => SystemErrno.EIO, + Win32Error.DISK_CORRUPT => SystemErrno.EIO, + Win32Error.EOM_OVERFLOW => SystemErrno.EIO, + Win32Error.FILEMARK_DETECTED => SystemErrno.EIO, + Win32Error.GEN_FAILURE => SystemErrno.EIO, + Win32Error.INVALID_BLOCK_LENGTH => SystemErrno.EIO, + Win32Error.IO_DEVICE => SystemErrno.EIO, + Win32Error.NO_DATA_DETECTED => SystemErrno.EIO, + Win32Error.NO_SIGNAL_SENT => SystemErrno.EIO, + Win32Error.OPEN_FAILED => SystemErrno.EIO, + Win32Error.SETMARK_DETECTED => SystemErrno.EIO, + Win32Error.SIGNAL_REFUSED => SystemErrno.EIO, + Win32Error.WSAEISCONN => SystemErrno.EISCONN, + Win32Error.CANT_RESOLVE_FILENAME => SystemErrno.ELOOP, + Win32Error.TOO_MANY_OPEN_FILES => SystemErrno.EMFILE, + Win32Error.WSAEMFILE => SystemErrno.EMFILE, + Win32Error.WSAEMSGSIZE => SystemErrno.EMSGSIZE, + Win32Error.FILENAME_EXCED_RANGE => SystemErrno.ENAMETOOLONG, + Win32Error.NETWORK_UNREACHABLE => SystemErrno.ENETUNREACH, + Win32Error.WSAENETUNREACH => SystemErrno.ENETUNREACH, + Win32Error.WSAENOBUFS => SystemErrno.ENOBUFS, + Win32Error.BAD_PATHNAME => SystemErrno.ENOENT, + Win32Error.DIRECTORY => SystemErrno.ENOENT, + Win32Error.ENVVAR_NOT_FOUND => SystemErrno.ENOENT, + Win32Error.FILE_NOT_FOUND => SystemErrno.ENOENT, + Win32Error.INVALID_NAME => SystemErrno.ENOENT, + Win32Error.INVALID_DRIVE => SystemErrno.ENOENT, + Win32Error.INVALID_REPARSE_DATA => SystemErrno.ENOENT, + Win32Error.MOD_NOT_FOUND => SystemErrno.ENOENT, + Win32Error.PATH_NOT_FOUND => SystemErrno.ENOENT, + Win32Error.WSAHOST_NOT_FOUND => SystemErrno.ENOENT, + Win32Error.WSANO_DATA => SystemErrno.ENOENT, + Win32Error.NOT_ENOUGH_MEMORY => SystemErrno.ENOMEM, + Win32Error.OUTOFMEMORY => SystemErrno.ENOMEM, + Win32Error.CANNOT_MAKE => SystemErrno.ENOSPC, + Win32Error.DISK_FULL => SystemErrno.ENOSPC, + Win32Error.EA_TABLE_FULL => SystemErrno.ENOSPC, + Win32Error.END_OF_MEDIA => SystemErrno.ENOSPC, + Win32Error.HANDLE_DISK_FULL => SystemErrno.ENOSPC, + Win32Error.NOT_CONNECTED => SystemErrno.ENOTCONN, + Win32Error.WSAENOTCONN => SystemErrno.ENOTCONN, + Win32Error.DIR_NOT_EMPTY => SystemErrno.ENOTEMPTY, + Win32Error.WSAENOTSOCK => SystemErrno.ENOTSOCK, + Win32Error.NOT_SUPPORTED => SystemErrno.ENOTSUP, + Win32Error.BROKEN_PIPE => SystemErrno.EOF, + Win32Error.ACCESS_DENIED => SystemErrno.EPERM, + Win32Error.PRIVILEGE_NOT_HELD => SystemErrno.EPERM, + Win32Error.BAD_PIPE => SystemErrno.EPIPE, + Win32Error.NO_DATA => SystemErrno.EPIPE, + Win32Error.PIPE_NOT_CONNECTED => SystemErrno.EPIPE, + Win32Error.WSAESHUTDOWN => SystemErrno.EPIPE, + Win32Error.WSAEPROTONOSUPPORT => SystemErrno.EPROTONOSUPPORT, + Win32Error.WRITE_PROTECT => SystemErrno.EROFS, + Win32Error.SEM_TIMEOUT => SystemErrno.ETIMEDOUT, + Win32Error.WSAETIMEDOUT => SystemErrno.ETIMEDOUT, + Win32Error.NOT_SAME_DEVICE => SystemErrno.EXDEV, + Win32Error.INVALID_FUNCTION => SystemErrno.EISDIR, + Win32Error.META_EXPANSION_TOO_LONG => SystemErrno.E2BIG, + Win32Error.WSAESOCKTNOSUPPORT => SystemErrno.ESOCKTNOSUPPORT, + Win32Error.DELETE_PENDING => SystemErrno.EBUSY, + else => return null, + }; + } + + if (comptime std.meta.trait.isSignedInt(@TypeOf(code))) { + if (code < 0) + return init(-code); + } + + if (code >= max) return null; + return @as(SystemErrno, @enumFromInt(code)); + } + + pub fn label(this: SystemErrno) ?[]const u8 { + return labels.get(this) orelse null; + } + + const LabelMap = std.EnumMap(SystemErrno, []const u8); + pub const labels: LabelMap = brk: { + var map: LabelMap = LabelMap.initFull(""); + + map.put(.EPERM, "Operation not permitted"); + map.put(.ENOENT, "No such file or directory"); + map.put(.ESRCH, "No such process"); + map.put(.EINTR, "Interrupted system call"); + map.put(.EIO, "I/O error"); + map.put(.ENXIO, "No such device or address"); + map.put(.E2BIG, "Argument list too long"); + map.put(.ENOEXEC, "Exec format error"); + map.put(.EBADF, "Bad file number"); + map.put(.ECHILD, "No child processes"); + map.put(.EAGAIN, "Try again"); + map.put(.EOF, "End of file"); + map.put(.ENOMEM, "Out of memory"); + map.put(.EACCES, "Permission denied"); + map.put(.EFAULT, "Bad address"); + map.put(.ENOTBLK, "Block device required"); + map.put(.EBUSY, "Device or resource busy"); + map.put(.EEXIST, "File or folder exists"); + map.put(.EXDEV, "Cross-device link"); + map.put(.ENODEV, "No such device"); + map.put(.ENOTDIR, "Not a directory"); + map.put(.EISDIR, "Is a directory"); + map.put(.EINVAL, "Invalid argument"); + map.put(.ENFILE, "File table overflow"); + map.put(.EMFILE, "Too many open files"); + map.put(.ECHARSET, "Invalid or incomplete multibyte or wide character"); + map.put(.ENOTTY, "Not a typewriter"); + map.put(.ETXTBSY, "Text file busy"); + map.put(.EFBIG, "File too large"); + map.put(.ENOSPC, "No space left on device"); + map.put(.ESPIPE, "Illegal seek"); + map.put(.EROFS, "Read-only file system"); + map.put(.EMLINK, "Too many links"); + map.put(.EPIPE, "Broken pipe"); + map.put(.EDOM, "Math argument out of domain of func"); + map.put(.ERANGE, "Math result not representable"); + map.put(.EDEADLK, "Resource deadlock would occur"); + map.put(.ENAMETOOLONG, "File name too long"); + map.put(.ENOLCK, "No record locks available"); + map.put(.EUNKNOWN, "An unknown error occurred"); + map.put(.ENOSYS, "Function not implemented"); + map.put(.ENOTEMPTY, "Directory not empty"); + map.put(.ELOOP, "Too many symbolic links encountered"); + map.put(.ENOMSG, "No message of desired type"); + map.put(.EIDRM, "Identifier removed"); + map.put(.ECHRNG, "Channel number out of range"); + map.put(.EL2NSYNC, "Level 2 not synchronized"); + map.put(.EL3HLT, "Level 3 halted"); + map.put(.EL3RST, "Level 3 reset"); + map.put(.ELNRNG, "Link number out of range"); + map.put(.EUNATCH, "Protocol driver not attached"); + map.put(.ENOCSI, "No CSI structure available"); + map.put(.EL2HLT, "Level 2 halted"); + map.put(.EBADE, "Invalid exchange"); + map.put(.EBADR, "Invalid request descriptor"); + map.put(.EXFULL, "Exchange full"); + map.put(.ENOANO, "No anode"); + map.put(.EBADRQC, "Invalid request code"); + map.put(.EBADSLT, "Invalid slot"); + map.put(.EBFONT, "Bad font file format"); + map.put(.ENOSTR, "Device not a stream"); + map.put(.ENODATA, "No data available"); + map.put(.ETIME, "Timer expired"); + map.put(.ENOSR, "Out of streams resources"); + map.put(.ENONET, "Machine is not on the network"); + map.put(.ENOPKG, "Package not installed"); + map.put(.EREMOTE, "Object is remote"); + map.put(.ENOLINK, "Link has been severed"); + map.put(.EADV, "Advertise error"); + map.put(.ESRMNT, "Srmount error"); + map.put(.ECOMM, "Communication error on send"); + map.put(.EPROTO, "Protocol error"); + map.put(.EMULTIHOP, "Multihop attempted"); + map.put(.EDOTDOT, "RFS specific error"); + map.put(.EBADMSG, "Not a data message"); + map.put(.EOVERFLOW, "Value too large for defined data type"); + map.put(.ENOTUNIQ, "Name not unique on network"); + map.put(.EBADFD, "File descriptor in bad state"); + map.put(.EREMCHG, "Remote address changed"); + map.put(.ELIBACC, "Can not access a needed shared library"); + map.put(.ELIBBAD, "Accessing a corrupted shared library"); + map.put(.ELIBSCN, "lib section in a.out corrupted"); + map.put(.ELIBMAX, "Attempting to link in too many shared libraries"); + map.put(.ELIBEXEC, "Cannot exec a shared library directly"); + map.put(.EILSEQ, "Illegal byte sequence"); + map.put(.ERESTART, "Interrupted system call should be restarted"); + map.put(.ESTRPIPE, "Streams pipe error"); + map.put(.EUSERS, "Too many users"); + map.put(.ENOTSOCK, "Socket operation on non-socket"); + map.put(.EDESTADDRREQ, "Destination address required"); + map.put(.EMSGSIZE, "Message too long"); + map.put(.EPROTOTYPE, "Protocol wrong type for socket"); + map.put(.ENOPROTOOPT, "Protocol not available"); + map.put(.EPROTONOSUPPORT, "Protocol not supported"); + map.put(.ESOCKTNOSUPPORT, "Socket type not supported"); + map.put(.ENOTSUP, "Operation not supported on transport endpoint"); + map.put(.EPFNOSUPPORT, "Protocol family not supported"); + map.put(.EAFNOSUPPORT, "Address family not supported by protocol"); + map.put(.EADDRINUSE, "Address already in use"); + map.put(.EADDRNOTAVAIL, "Cannot assign requested address"); + map.put(.ENETDOWN, "Network is down"); + map.put(.ENETUNREACH, "Network is unreachable"); + map.put(.ENETRESET, "Network dropped connection because of reset"); + map.put(.ECONNABORTED, "Software caused connection abort"); + map.put(.ECONNRESET, "Connection reset by peer"); + map.put(.ENOBUFS, "No buffer space available"); + map.put(.EISCONN, "Transport endpoint is already connected"); + map.put(.ENOTCONN, "Transport endpoint is not connected"); + map.put(.ESHUTDOWN, "Cannot send after transport endpoint shutdown"); + map.put(.ETOOMANYREFS, "Too many references: cannot splice"); + map.put(.ETIMEDOUT, "Connection timed out"); + map.put(.ECONNREFUSED, "Connection refused"); + map.put(.EHOSTDOWN, "Host is down"); + map.put(.EHOSTUNREACH, "No route to host"); + map.put(.EALREADY, "Operation already in progress"); + map.put(.EINPROGRESS, "Operation now in progress"); + map.put(.ESTALE, "Stale NFS file handle"); + map.put(.EUCLEAN, "Structure needs cleaning"); + map.put(.ENOTNAM, "Not a XENIX named type file"); + map.put(.ENAVAIL, "No XENIX semaphores available"); + map.put(.EISNAM, "Is a named type file"); + map.put(.EREMOTEIO, "Remote I/O error"); + map.put(.EDQUOT, "Quota exceeded"); + map.put(.ENOMEDIUM, "No medium found"); + map.put(.EMEDIUMTYPE, "Wrong medium type"); + map.put(.ECANCELED, "Operation Canceled"); + map.put(.ENOKEY, "Required key not available"); + map.put(.EKEYEXPIRED, "Key has expired"); + map.put(.EKEYREVOKED, "Key has been revoked"); + map.put(.EKEYREJECTED, "Key was rejected by service"); + map.put(.EOWNERDEAD, "Owner died"); + map.put(.ENOTRECOVERABLE, "State not recoverable"); + break :brk map; + }; +}; + +pub const off_t = i64; +pub fn preallocate_file(_: os.fd_t, _: off_t, _: off_t) !void {} + +pub const E = enum(u8) { + SUCCESS = 0, + PERM = 1, + NOENT = 2, + SRCH = 3, + INTR = 4, + IO = 5, + NXIO = 6, + @"2BIG" = 7, + NOEXEC = 8, + BADF = 9, + CHILD = 10, + AGAIN = 11, + NOMEM = 12, + ACCES = 13, + FAULT = 14, + NOTBLK = 15, + BUSY = 16, + EXIST = 17, + XDEV = 18, + NODEV = 19, + NOTDIR = 20, + ISDIR = 21, + INVAL = 22, + NFILE = 23, + MFILE = 24, + NOTTY = 25, + TXTBSY = 26, + FBIG = 27, + NOSPC = 28, + SPIPE = 29, + ROFS = 30, + MLINK = 31, + PIPE = 32, + DOM = 33, + RANGE = 34, + DEADLK = 35, + NAMETOOLONG = 36, + NOLCK = 37, + NOSYS = 38, + NOTEMPTY = 39, + LOOP = 40, + WOULDBLOCK = 41, + NOMSG = 42, + IDRM = 43, + CHRNG = 44, + L2NSYNC = 45, + L3HLT = 46, + L3RST = 47, + LNRNG = 48, + UNATCH = 49, + NOCSI = 50, + L2HLT = 51, + BADE = 52, + BADR = 53, + XFULL = 54, + NOANO = 55, + BADRQC = 56, + BADSLT = 57, + DEADLOCK = 58, + BFONT = 59, + NOSTR = 60, + NODATA = 61, + TIME = 62, + NOSR = 63, + NONET = 64, + NOPKG = 65, + REMOTE = 66, + NOLINK = 67, + ADV = 68, + SRMNT = 69, + COMM = 70, + PROTO = 71, + MULTIHOP = 72, + DOTDOT = 73, + BADMSG = 74, + OVERFLOW = 75, + NOTUNIQ = 76, + BADFD = 77, + REMCHG = 78, + LIBACC = 79, + LIBBAD = 80, + LIBSCN = 81, + LIBMAX = 82, + LIBEXEC = 83, + ILSEQ = 84, + RESTART = 85, + STRPIPE = 86, + USERS = 87, + NOTSOCK = 88, + DESTADDRREQ = 89, + MSGSIZE = 90, + PROTOTYPE = 91, + NOPROTOOPT = 92, + PROTONOSUPPORT = 93, + SOCKTNOSUPPORT = 94, + NOTSUP = 95, + PFNOSUPPORT = 96, + AFNOSUPPORT = 97, + ADDRINUSE = 98, + ADDRNOTAVAIL = 99, + NETDOWN = 100, + NETUNREACH = 101, + NETRESET = 102, + CONNABORTED = 103, + CONNRESET = 104, + NOBUFS = 105, + ISCONN = 106, + NOTCONN = 107, + SHUTDOWN = 108, + TOOMANYREFS = 109, + TIMEDOUT = 110, + CONNREFUSED = 111, + HOSTDOWN = 112, + HOSTUNREACH = 113, + ALREADY = 114, + INPROGRESS = 115, + STALE = 116, + UCLEAN = 117, + NOTNAM = 118, + NAVAIL = 119, + ISNAM = 120, + REMOTEIO = 121, + DQUOT = 122, + NOMEDIUM = 123, + MEDIUMTYPE = 124, + CANCELED = 125, + NOKEY = 126, + KEYEXPIRED = 127, + KEYREVOKED = 128, + KEYREJECTED = 129, + OWNERDEAD = 130, + NOTRECOVERABLE = 131, + RFKILL = 132, + HWPOISON = 133, + UNKNOWN = 134, + CHARSET = 135, + OF = 136, +}; + +pub fn getErrno(_: anytype) E { + if (Win32Error.get().toSystemErrno()) |sys| { + return sys.toE(); + } + + return .SUCCESS; +} |