1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
//go:build linux || freebsd || darwin
package util
import (
"fmt"
"syscall"
"github.com/docker/go-units"
)
func ParseUlimit(ulimit string) (*units.Ulimit, error) {
ul, err := units.ParseUlimit(ulimit)
if err != nil {
return nil, fmt.Errorf("ulimit option %q requires name=SOFT:HARD, failed to be parsed: %w", ulimit, err)
}
if ul.Hard != -1 && ul.Soft == -1 {
return ul, nil
}
rl, err := ul.GetRlimit()
if err != nil {
return nil, err
}
var limit syscall.Rlimit
if err := syscall.Getrlimit(rl.Type, &limit); err != nil {
return nil, err
}
if ul.Soft == -1 {
ul.Soft = int64(limit.Cur)
}
if ul.Hard == -1 {
ul.Hard = int64(limit.Max)
}
return ul, nil
}
|