1// Copyright 2017 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:build !plan9 && !windows
6// +build !plan9,!windows
7
8package main
9
10/*
11#include <signal.h>
12#include <stdlib.h>
13#include <string.h>
14
15static void abrthandler(int signum) {
16	if (signum == SIGABRT) {
17		exit(0);  // success
18	}
19}
20
21void registerAbortHandler() {
22	struct sigaction act;
23	memset(&act, 0, sizeof act);
24	act.sa_handler = abrthandler;
25	sigaction(SIGABRT, &act, NULL);
26}
27
28static void __attribute__ ((constructor)) sigsetup(void) {
29	if (getenv("CGOCATCHPANIC_EARLY_HANDLER") == NULL)
30		return;
31	registerAbortHandler();
32}
33*/
34import "C"
35import "os"
36
37func init() {
38	register("CgoCatchPanic", CgoCatchPanic)
39}
40
41// Test that the SIGABRT raised by panic can be caught by an early signal handler.
42func CgoCatchPanic() {
43	if _, ok := os.LookupEnv("CGOCATCHPANIC_EARLY_HANDLER"); !ok {
44		C.registerAbortHandler()
45	}
46	panic("catch me")
47}
48