mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-01-31 11:37:35 +00:00
adac64a52b
The includes in libc/calls/calls.h have now been refactored so that functions with struct parameters are declared in libc/calls/struct/
76 lines
2.7 KiB
C
76 lines
2.7 KiB
C
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:4;tab-width:8;coding:utf-8 -*-│
|
|
│vi: set net ft=c ts=4 sts=4 sw=4 fenc=utf-8 :vi│
|
|
╞══════════════════════════════════════════════════════════════════════════════╡
|
|
│ Python 3 │
|
|
│ https://docs.python.org/3/license.html │
|
|
╚─────────────────────────────────────────────────────────────────────────────*/
|
|
#include "libc/calls/calls.h"
|
|
#include "libc/calls/struct/sigaction.h"
|
|
#include "third_party/python/Include/pydebug.h"
|
|
#include "third_party/python/Include/pylifecycle.h"
|
|
#include "third_party/python/pyconfig.h"
|
|
/* clang-format off */
|
|
|
|
PyOS_sighandler_t
|
|
PyOS_getsig(int sig)
|
|
{
|
|
#ifdef HAVE_SIGACTION
|
|
struct sigaction context;
|
|
if (sigaction(sig, NULL, &context) == -1)
|
|
return SIG_ERR;
|
|
return context.sa_handler;
|
|
#else
|
|
PyOS_sighandler_t handler;
|
|
/* Special signal handling for the secure CRT in Visual Studio 2005 */
|
|
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
|
switch (sig) {
|
|
/* Only these signals are valid */
|
|
case SIGINT:
|
|
case SIGILL:
|
|
case SIGFPE:
|
|
case SIGSEGV:
|
|
case SIGTERM:
|
|
case SIGBREAK:
|
|
case SIGABRT:
|
|
break;
|
|
/* Don't call signal() with other values or it will assert */
|
|
default:
|
|
return SIG_ERR;
|
|
}
|
|
#endif /* _MSC_VER && _MSC_VER >= 1400 */
|
|
handler = signal(sig, SIG_IGN);
|
|
if (handler != SIG_ERR)
|
|
signal(sig, handler);
|
|
return handler;
|
|
#endif
|
|
}
|
|
|
|
/*
|
|
* All of the code in this function must only use async-signal-safe functions,
|
|
* listed at `man 7 signal` or
|
|
* http://www.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
|
|
*/
|
|
PyOS_sighandler_t
|
|
PyOS_setsig(int sig, PyOS_sighandler_t handler)
|
|
{
|
|
#ifdef HAVE_SIGACTION
|
|
/* Some code in Modules/signalmodule.c depends on sigaction() being
|
|
* used here if HAVE_SIGACTION is defined. Fix that if this code
|
|
* changes to invalidate that assumption.
|
|
*/
|
|
struct sigaction context, ocontext;
|
|
context.sa_handler = handler;
|
|
sigemptyset(&context.sa_mask);
|
|
context.sa_flags = 0;
|
|
if (sigaction(sig, &context, &ocontext) == -1)
|
|
return SIG_ERR;
|
|
return ocontext.sa_handler;
|
|
#else
|
|
PyOS_sighandler_t oldhandler;
|
|
oldhandler = signal(sig, handler);
|
|
#ifdef HAVE_SIGINTERRUPT
|
|
siginterrupt(sig, 1);
|
|
#endif
|
|
return oldhandler;
|
|
#endif
|
|
}
|