// Copyright 2012 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
// Test that setgid does not hang on GNU/Linux. | |
// See https://golang.org/issue/3871 for details. | |
package cgotest | |
/* | |
#include <sys/types.h> | |
#include <unistd.h> | |
*/ | |
import "C" | |
import ( | |
"os" | |
"os/signal" | |
"syscall" | |
"testing" | |
"time" | |
) | |
func runTestSetgid() bool { | |
c := make(chan bool) | |
go func() { | |
C.setgid(0) | |
c <- true | |
}() | |
select { | |
case <-c: | |
return true | |
case <-time.After(5 * time.Second): | |
return false | |
} | |
} | |
func testSetgid(t *testing.T) { | |
if !runTestSetgid() { | |
t.Error("setgid hung") | |
} | |
// Now try it again after using signal.Notify. | |
signal.Notify(make(chan os.Signal, 1), syscall.SIGINT) | |
if !runTestSetgid() { | |
t.Error("setgid hung after signal.Notify") | |
} | |
} |