uv_err_code uv_translate_sys_error(int sys_errno) {
switch (sys_errno) {
case ERROR_SUCCESS: return UV_OK;
+ case ERROR_FILE_NOT_FOUND: return UV_ENOENT;
case ERROR_NOACCESS: return UV_EACCESS;
case WSAEACCES: return UV_EACCESS;
case ERROR_ADDRESS_ALREADY_ASSOCIATED: return UV_EADDRINUSE;
case WSAEAFNOSUPPORT: return UV_EAFNOSUPPORT;
case WSAEWOULDBLOCK: return UV_EAGAIN;
case WSAEALREADY: return UV_EALREADY;
+ case ERROR_CONNECTION_ABORTED: return UV_ECONNABORTED;
+ case WSAECONNABORTED: return UV_ECONNABORTED;
case ERROR_CONNECTION_REFUSED: return UV_ECONNREFUSED;
case WSAECONNREFUSED: return UV_ECONNREFUSED;
case WSAEFAULT: return UV_EFAULT;
req->last_error = error; \
req->flags |= UV_FS_LAST_ERROR_SET;
+#define SET_REQ_RESULT(req, result_value) \
+ req->result = (result_value); \
+ if (req->result == -1) { \
+ req->errorno = uv_translate_sys_error(_doserrno); \
+ }
+
+#define SET_REQ_RESULT_WIN32_ERROR(req, sys_errno) \
+ req->result = -1; \
+ req->errorno = uv_translate_sys_error(sys_errno); \
+ SET_REQ_LAST_ERROR(req, sys_errno);
+
void uv_fs_init() {
_fmode = _O_BINARY;
attributes,
NULL);
if (file == INVALID_HANDLE_VALUE) {
- result = -1;
- goto end;
+ SET_REQ_RESULT_WIN32_ERROR(req, GetLastError());
+ return;
}
result = _open_osfhandle((intptr_t)file, flags);
end:
free(path2);
if(dir == INVALID_HANDLE_VALUE) {
- result = -1;
- SET_REQ_LAST_ERROR(req, GetLastError());
- goto done;
+ SET_REQ_RESULT_WIN32_ERROR(req, GetLastError());
+ return;
}
buf = (char*)malloc(buf_size);
void fs__fsync(uv_fs_t* req, uv_file file) {
int result = FlushFileBuffers((HANDLE)_get_osfhandle(file)) ? 0 : -1;
if (result == -1) {
- SET_REQ_LAST_ERROR(req, GetLastError());
+ SET_REQ_RESULT_WIN32_ERROR(req, GetLastError());
+ } else {
+ SET_REQ_RESULT(req, result);
}
- SET_REQ_RESULT(req, result);
}
void fs__link(uv_fs_t* req, const char* path, const char* new_path) {
int result = CreateHardLinkA(new_path, path, NULL) ? 0 : -1;
if (result == -1) {
- SET_REQ_LAST_ERROR(req, GetLastError());
+ SET_REQ_RESULT_WIN32_ERROR(req, GetLastError());
+ } else {
+ SET_REQ_RESULT(req, result);
}
- SET_REQ_RESULT(req, result);
}
int result = -1;
BOOL rv;
HANDLE symlink;
- void* buffer;
+ void* buffer = NULL;
DWORD bytes_returned;
REPARSE_DATA_BUFFER* reparse_data;
int utf8size;
# define STATUS_HASH_NOT_PRESENT ((NTSTATUS) 0xC000A101L)
#endif
-#ifndef NTSTATUS_FROM_WIN32
-# define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \
- ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \
- (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_ERROR)))
-#endif
+/* This is not the NTSTATUS_FROM_WIN32 that the DDK provides, because the
+/* DDK got it wrong! */
+#ifdef NTSTATUS_FROM_WIN32
+# undef NTSTATUS_FROM_WIN32
+#endif
+#define NTSTATUS_FROM_WIN32(error) ((NTSTATUS) (error) <= 0 ? \
+ ((NTSTATUS) (error)) : ((NTSTATUS) (((error) & 0x0000FFFF) | \
+ (FACILITY_NTWIN32 << 16) | ERROR_SEVERITY_WARNING)))
/* from ntifs.h */
/* MinGW already has it */