You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
"io/ioutil"
|
|
"log"
|
|
"strconv"
|
|
"strings"
|
|
"syscall"
|
|
"unsafe"
|
|
|
|
"github.com/lawl/pulseaudio"
|
|
)
|
|
|
|
const rlimitRTTime = 15
|
|
|
|
func getPulsePid() (int, error) {
|
|
pulsepidfile, err := pulseaudio.RuntimePath("pid")
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
pidbuf, err := ioutil.ReadFile(pulsepidfile)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
pid, err := strconv.Atoi(strings.TrimSpace(string(pidbuf)))
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return pid, nil
|
|
}
|
|
|
|
func getRlimit(pid int) (syscall.Rlimit, error) {
|
|
var res syscall.Rlimit
|
|
err := pRlimit(pid, rlimitRTTime, nil, &res)
|
|
return res, err
|
|
}
|
|
|
|
func setRlimit(pid int, new *syscall.Rlimit) error {
|
|
var junk syscall.Rlimit
|
|
err := pRlimit(pid, rlimitRTTime, new, &junk)
|
|
return err
|
|
}
|
|
|
|
func removeRlimit(pid int) {
|
|
const MaxUint = ^uint64(0)
|
|
new := syscall.Rlimit{Cur: MaxUint, Max: MaxUint}
|
|
err := setRlimit(pid, &new)
|
|
if err != nil {
|
|
log.Printf("Couldn't set rlimit with caps\n")
|
|
}
|
|
}
|
|
|
|
func pRlimit(pid int, limit uintptr, new *syscall.Rlimit, old *syscall.Rlimit) error {
|
|
_, _, errno := syscall.RawSyscall6(syscall.SYS_PRLIMIT64,
|
|
uintptr(pid),
|
|
limit,
|
|
uintptr(unsafe.Pointer(new)),
|
|
uintptr(unsafe.Pointer(old)), 0, 0)
|
|
if errno != 0 {
|
|
return errno
|
|
}
|
|
return nil
|
|
}
|