xref: /aosp_15_r20/external/libcap/go/psx-signals.go (revision 2810ac1b38eead2603277920c78344c84ddf3aff)
1*2810ac1bSKiyoung Kim// Program psx-signals validates that the psx mechanism can coexist
2*2810ac1bSKiyoung Kim// with Go use of signals. This is an unprivilaged program derived
3*2810ac1bSKiyoung Kim// from the sample code provided in this bug report:
4*2810ac1bSKiyoung Kim//
5*2810ac1bSKiyoung Kim//   https://bugzilla.kernel.org/show_bug.cgi?id=210533
6*2810ac1bSKiyoung Kimpackage main
7*2810ac1bSKiyoung Kim
8*2810ac1bSKiyoung Kimimport (
9*2810ac1bSKiyoung Kim	"fmt"
10*2810ac1bSKiyoung Kim	"log"
11*2810ac1bSKiyoung Kim	"os"
12*2810ac1bSKiyoung Kim	"os/signal"
13*2810ac1bSKiyoung Kim	"syscall"
14*2810ac1bSKiyoung Kim	"time"
15*2810ac1bSKiyoung Kim
16*2810ac1bSKiyoung Kim	"kernel.org/pub/linux/libs/security/libcap/psx"
17*2810ac1bSKiyoung Kim)
18*2810ac1bSKiyoung Kim
19*2810ac1bSKiyoung Kimconst maxSig = 10
20*2810ac1bSKiyoung Kimconst prSetKeepCaps = 8
21*2810ac1bSKiyoung Kim
22*2810ac1bSKiyoung Kimfunc main() {
23*2810ac1bSKiyoung Kim	sig := make(chan os.Signal, maxSig)
24*2810ac1bSKiyoung Kim	signal.Notify(sig, os.Interrupt)
25*2810ac1bSKiyoung Kim
26*2810ac1bSKiyoung Kim	fmt.Print("Toggling KEEP_CAPS ")
27*2810ac1bSKiyoung Kim	for i := 0; i < maxSig; i++ {
28*2810ac1bSKiyoung Kim		fmt.Print(".")
29*2810ac1bSKiyoung Kim		_, _, err := psx.Syscall3(syscall.SYS_PRCTL, prSetKeepCaps, uintptr(i&1), 0)
30*2810ac1bSKiyoung Kim		if err != 0 {
31*2810ac1bSKiyoung Kim			log.Fatalf("[%d] attempt to set KEEPCAPS (to %d) failed: %v", i, i%2, err)
32*2810ac1bSKiyoung Kim		}
33*2810ac1bSKiyoung Kim	}
34*2810ac1bSKiyoung Kim
35*2810ac1bSKiyoung Kim	fmt.Println(" done")
36*2810ac1bSKiyoung Kim	fmt.Print("Wait 1 second to see if unwanted signals arrive...")
37*2810ac1bSKiyoung Kim	// Confirm no signals are delivered.
38*2810ac1bSKiyoung Kim	select {
39*2810ac1bSKiyoung Kim	case <-time.After(1 * time.Second):
40*2810ac1bSKiyoung Kim		break
41*2810ac1bSKiyoung Kim	case info := <-sig:
42*2810ac1bSKiyoung Kim		log.Fatalf("signal received: %v", info)
43*2810ac1bSKiyoung Kim	}
44*2810ac1bSKiyoung Kim	fmt.Println(" none arrived")
45*2810ac1bSKiyoung Kim	fmt.Println("PASSED")
46*2810ac1bSKiyoung Kim}
47