diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 3b8699193..b858a9ccd 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2015-04-01 Jon TURNEY + + * external.cc (cygwin_internal): Add operation to retrieve a copy + of the EXCEPTION_RECORD from a siginfo_t *. + * include/sys/cygwin.h (cygwin_getinfo_types): Ditto. + * exception.h (cygwin_exception): Add exception_record accessor. + 2015-04-01 Jon TURNEY * include/cygwin/signal.h : Rename struct ucontext to struct diff --git a/winsup/cygwin/exception.h b/winsup/cygwin/exception.h index 3686bb0b2..0478daf79 100644 --- a/winsup/cygwin/exception.h +++ b/winsup/cygwin/exception.h @@ -175,4 +175,5 @@ public: framep (in_framep), ctx (in_ctx), e (in_e), h (NULL) {} void dumpstack (); PCONTEXT context () const {return ctx;} + EXCEPTION_RECORD *exception_record () const {return e;} }; diff --git a/winsup/cygwin/external.cc b/winsup/cygwin/external.cc index 5fac4bb66..e379df1d2 100644 --- a/winsup/cygwin/external.cc +++ b/winsup/cygwin/external.cc @@ -27,6 +27,7 @@ details. */ #include "environ.h" #include "cygserver_setpwd.h" #include "pwdgrp.h" +#include "exception.h" #include #include #include @@ -688,6 +689,19 @@ cygwin_internal (cygwin_getinfo_types t, ...) res = 0; break; + case CW_EXCEPTION_RECORD_FROM_SIGINFO_T: + { + siginfo_t *si = va_arg(arg, siginfo_t *); + EXCEPTION_RECORD *er = va_arg(arg, EXCEPTION_RECORD *); + if (si && si->si_cyg && er) + { + memcpy(er, ((cygwin_exception *)si->si_cyg)->exception_record(), + sizeof(EXCEPTION_RECORD)); + res = 0; + } + } + break; + default: set_errno (ENOSYS); } diff --git a/winsup/cygwin/include/sys/cygwin.h b/winsup/cygwin/include/sys/cygwin.h index edfcc565a..2ec6086b0 100644 --- a/winsup/cygwin/include/sys/cygwin.h +++ b/winsup/cygwin/include/sys/cygwin.h @@ -1,3 +1,4 @@ + /* sys/cygwin.h Copyright 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, @@ -153,7 +154,8 @@ typedef enum CW_CYGNAME_FROM_WINNAME, CW_FIXED_ATEXIT, CW_GETNSS_PWD_SRC, - CW_GETNSS_GRP_SRC + CW_GETNSS_GRP_SRC, + CW_EXCEPTION_RECORD_FROM_SIGINFO_T, } cygwin_getinfo_types; #define CW_LOCK_PINFO CW_LOCK_PINFO @@ -214,6 +216,7 @@ typedef enum #define CW_FIXED_ATEXIT CW_FIXED_ATEXIT #define CW_GETNSS_PWD_SRC CW_GETNSS_PWD_SRC #define CW_GETNSS_GRP_SRC CW_GETNSS_GRP_SRC +#define CW_EXCEPTION_RECORD_FROM_SIGINFO_T CW_EXCEPTION_RECORD_FROM_SIGINFO_T /* Token type for CW_SET_EXTERNAL_TOKEN */ enum