OSDN Git Service

* cygerrno.h (seterrno_from_nt_status): Declare.
authorcorinna <corinna>
Fri, 16 Apr 2010 15:42:28 +0000 (15:42 +0000)
committercorinna <corinna>
Fri, 16 Apr 2010 15:42:28 +0000 (15:42 +0000)
(__seterrno_from_nt_status): Call seterrno_from_nt_status.
* errno.cc (seterrno_from_win_error): Set errno without calling
set_errno to avoid packing strace output with errno messages.
(seterrno_from_nt_status): New function to print NT status as well as
resulting Windows error.

winsup/cygwin/ChangeLog
winsup/cygwin/cygerrno.h
winsup/cygwin/errno.cc

index 409a97c..e733162 100644 (file)
@@ -1,3 +1,12 @@
+2010-04-16  Corinna Vinschen  <corinna@vinschen.de>
+
+       * cygerrno.h (seterrno_from_nt_status): Declare.
+       (__seterrno_from_nt_status): Call seterrno_from_nt_status.
+       * errno.cc (seterrno_from_win_error): Set errno without calling
+       set_errno to avoid packing strace output with errno messages.
+       (seterrno_from_nt_status): New function to print NT status as well as
+       resulting Windows error.
+
 2010-04-15  Corinna Vinschen  <corinna@vinschen.de>
 
        * kernel32.cc (CreateEventW): Create event object with EVENT_ALL_ACCESS
index e6ec7c5..e1a1af0 100644 (file)
@@ -1,6 +1,6 @@
 /* cygerrno.h: main Cygwin header file.
 
-   Copyright 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2004, 2010 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -13,17 +13,13 @@ details. */
 #include <errno.h>
 
 void __stdcall seterrno_from_win_error (const char *file, int line, DWORD code) __attribute__ ((regparm(3)));
+void __stdcall seterrno_from_nt_status (const char *file, int line, NTSTATUS status) __attribute__ ((regparm(3)));
 void __stdcall seterrno (const char *, int line) __attribute__ ((regparm(2)));
 int __stdcall geterrno_from_win_error (DWORD code = GetLastError (), int deferrno = 13 /*EACCESS*/) __attribute__ ((regparm(2)));
 
 #define __seterrno() seterrno (__FILE__, __LINE__)
 #define __seterrno_from_win_error(val) seterrno_from_win_error (__FILE__, __LINE__, val)
-#define __seterrno_from_nt_status(status) \
-       ({ \
-         DWORD winerr = RtlNtStatusToDosError (status); \
-         SetLastError (winerr); \
-         __seterrno_from_win_error (winerr); \
-       })
+#define __seterrno_from_nt_status(status) seterrno_from_nt_status (__FILE__, __LINE__, status)
 
 inline int
 __set_errno (const char *fn, int ln, int val)
index 617970a..7365101 100644 (file)
@@ -1,7 +1,7 @@
 /* errno.cc: errno-related functions
 
    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-   2006, 2008, 2009 Red Hat, Inc.
+   2006, 2008, 2009, 2010 Red Hat, Inc.
 
 This file is part of Cygwin.
 
@@ -14,6 +14,7 @@ details. */
 #define _sys_errlist FOO_sys_errlist
 #include "winsup.h"
 #include "cygtls.h"
+#include "ntdll.h"
 #undef _sys_nerr
 #undef sys_nerr
 #undef _sys_errlist
@@ -316,7 +317,19 @@ void __stdcall
 seterrno_from_win_error (const char *file, int line, DWORD code)
 {
   syscall_printf ("%s:%d windows error %d", file, line, code);
-  set_errno (geterrno_from_win_error (code, EACCES));
+  errno = _impure_ptr->_errno =  geterrno_from_win_error (code, EACCES);
+}
+
+/* seterrno_from_nt_status: Given a NT status code, set errno
+   as appropriate. */
+void __stdcall
+seterrno_from_nt_status (const char *file, int line, NTSTATUS status)
+{
+  DWORD code = RtlNtStatusToDosError (status);
+  SetLastError (code);
+  syscall_printf ("%s:%d status %p -> windows error %d",
+                 file, line, status, code);
+  errno = _impure_ptr->_errno =  geterrno_from_win_error (code, EACCES);
 }
 
 /* seterrno: Set `errno' based on GetLastError (). */