|
@@ -18,6 +18,24 @@ func ParseKeyValueOpt(opt string) (string, string, error) {
|
|
return strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]), nil
|
|
return strings.TrimSpace(parts[0]), strings.TrimSpace(parts[1]), nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ParseUintListMaximum parses and validates the specified string as the value
|
|
|
|
+// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be
|
|
|
|
+// one of the formats below. Note that duplicates are actually allowed in the
|
|
|
|
+// input string. It returns a `map[int]bool` with available elements from `val`
|
|
|
|
+// set to `true`. Values larger than `maximum` cause an error if max is non zero,
|
|
|
|
+// in order to stop the map becoming excessively large.
|
|
|
|
+// Supported formats:
|
|
|
|
+// 7
|
|
|
|
+// 1-6
|
|
|
|
+// 0,3-4,7,8-10
|
|
|
|
+// 0-0,0,1-7
|
|
|
|
+// 03,1-3 <- this is gonna get parsed as [1,2,3]
|
|
|
|
+// 3,2,1
|
|
|
|
+// 0-2,3,1
|
|
|
|
+func ParseUintListMaximum(val string, maximum int) (map[int]bool, error) {
|
|
|
|
+ return parseUintList(val, maximum)
|
|
|
|
+}
|
|
|
|
+
|
|
// ParseUintList parses and validates the specified string as the value
|
|
// ParseUintList parses and validates the specified string as the value
|
|
// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be
|
|
// found in some cgroup file (e.g. `cpuset.cpus`, `cpuset.mems`), which could be
|
|
// one of the formats below. Note that duplicates are actually allowed in the
|
|
// one of the formats below. Note that duplicates are actually allowed in the
|
|
@@ -32,6 +50,10 @@ func ParseKeyValueOpt(opt string) (string, string, error) {
|
|
// 3,2,1
|
|
// 3,2,1
|
|
// 0-2,3,1
|
|
// 0-2,3,1
|
|
func ParseUintList(val string) (map[int]bool, error) {
|
|
func ParseUintList(val string) (map[int]bool, error) {
|
|
|
|
+ return parseUintList(val, 0)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func parseUintList(val string, maximum int) (map[int]bool, error) {
|
|
if val == "" {
|
|
if val == "" {
|
|
return map[int]bool{}, nil
|
|
return map[int]bool{}, nil
|
|
}
|
|
}
|
|
@@ -46,6 +68,9 @@ func ParseUintList(val string) (map[int]bool, error) {
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, errInvalidFormat
|
|
return nil, errInvalidFormat
|
|
}
|
|
}
|
|
|
|
+ if maximum != 0 && v > maximum {
|
|
|
|
+ return nil, fmt.Errorf("value of out range, maximum is %d", maximum)
|
|
|
|
+ }
|
|
availableInts[v] = true
|
|
availableInts[v] = true
|
|
} else {
|
|
} else {
|
|
split := strings.SplitN(r, "-", 2)
|
|
split := strings.SplitN(r, "-", 2)
|
|
@@ -60,6 +85,9 @@ func ParseUintList(val string) (map[int]bool, error) {
|
|
if max < min {
|
|
if max < min {
|
|
return nil, errInvalidFormat
|
|
return nil, errInvalidFormat
|
|
}
|
|
}
|
|
|
|
+ if maximum != 0 && max > maximum {
|
|
|
|
+ return nil, fmt.Errorf("value of out range, maximum is %d", maximum)
|
|
|
|
+ }
|
|
for i := min; i <= max; i++ {
|
|
for i := min; i <= max; i++ {
|
|
availableInts[i] = true
|
|
availableInts[i] = true
|
|
}
|
|
}
|