*** win32.c~ Sun Oct 03 19:07:01 2010 --- win32.c Sun Oct 10 01:02:17 2010 *************** static struct { *** 212,217 **** --- 212,229 ---- int rb_w32_map_errno(DWORD winerr) { + return rb_w32_exchange_errno(winerr, 0); + } + + int + rb_w32_unmap_errno(DWORD err) + { + return rb_w32_exchange_errno(err, 1); + } + + static int + rb_w32_exchange_errno(DWORD winerr, int direction) + { int i; if (winerr == 0) { *************** rb_w32_map_errno(DWORD winerr) *** 219,226 **** } for (i = 0; i < (int)(sizeof(errmap) / sizeof(*errmap)); i++) { ! if (errmap[i].winerr == winerr) { ! return errmap[i].err; } } --- 231,244 ---- } for (i = 0; i < (int)(sizeof(errmap) / sizeof(*errmap)); i++) { ! if (direction) { ! if (errmap[i].err == winerr) { ! return errmap[i].winerr; ! } ! } else { ! if (errmap[i].winerr == winerr) { ! return errmap[i].err; ! } } } *************** rb_w32_map_errno(DWORD winerr) *** 231,236 **** --- 249,255 ---- } #define map_errno rb_w32_map_errno + #define unmap_errno rb_w32_unmap_errno static const char *NTLoginName; *************** rb_w32_strerror(int e) *** 2198,2211 **** if (e < 0 || e > sys_nerr) { if (e < 0) e = GetLastError(); if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, &source, e, 0, buffer, sizeof(buffer), NULL) == 0) strlcpy(buffer, "Unknown Error", sizeof(buffer)); } ! else strlcpy(buffer, strerror(e), sizeof(buffer)); ! p = buffer; while ((p = strpbrk(p, "\r\n")) != NULL) { memmove(p, p + 1, strlen(p)); --- 2217,2233 ---- if (e < 0 || e > sys_nerr) { if (e < 0) e = GetLastError(); + else + e = unmap_errno(e); if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, &source, e, 0, buffer, sizeof(buffer), NULL) == 0) strlcpy(buffer, "Unknown Error", sizeof(buffer)); } ! else { strlcpy(buffer, strerror(e), sizeof(buffer)); ! } ! p = buffer; while ((p = strpbrk(p, "\r\n")) != NULL) { memmove(p, p + 1, strlen(p));