diff options
Diffstat (limited to 'sd_login/cgroup_skip.go')
-rw-r--r-- | sd_login/cgroup_skip.go | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/sd_login/cgroup_skip.go b/sd_login/cgroup_skip.go new file mode 100644 index 0000000..7eb2be8 --- /dev/null +++ b/sd_login/cgroup_skip.go @@ -0,0 +1,98 @@ +// Copyright (C) 2016-2017 Luke Shumaker <lukeshu@sbcglobal.net> +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package sd_login + +import ( + "strconv" + "strings" +) + +func (cgroup _Cgroup) SkipPath(prefix _Cgroup) (_Cgroup, bool) { + //skip: SkipPath(prefix _Cgroup) : SkipPath(prefix) + rest, ok := path_startswith(string(cgroup), string(prefix)) + if ok { + return _Cgroup(rest), true + } else { + return cgroup, false + } +} + +// Skip (*.slice){1,} +func (cgroup _Cgroup) SkipSlices() (_Cgroup, bool) { + //skip: SkipSlices() : SkipSlices() + cg := string(cgroup) + skipped := false + for { + cg = strings.TrimLeft(cg, "/") + part, rest := split2(cg, '/') + if !valid_slice_name(part) { + return _Cgroup(cg), skipped + } + skipped = true + cg = rest + } +} + +// Skip user@*.service +func (cgroup _Cgroup) SkipUserManager() (_Cgroup, bool) { + //skip: SkipUserManager() : SkipUserManager() + part, rest := split2(strings.TrimLeft(string(cgroup), "/"), '/') + uid_str, ok := trimPrefixSuffix(part, "user@", ".service") + if !ok { + return cgroup, false + } + _, err := strconv.Atoi(uid_str) + if err != nil { + return cgroup, false + } + return _Cgroup(rest), true +} + +// Skip session-*.scope +func (cgroup _Cgroup) SkipSession() (_Cgroup, bool) { + //skip: SkipSession() : SkipSession() + part, rest := split2(strings.TrimLeft(string(cgroup), "/"), '/') + session, ok := trimPrefixSuffix(part, "session-", ".scope") + if !ok { + return cgroup, false + } + if !valid_session_name(session) { + return cgroup, false + } + return _Cgroup(rest), true +} + +// Skip (/*.slice){0,}/(user@*.service|session-*.scope) +func (cgroup _Cgroup) SkipUserPrefix() (_Cgroup, bool) { + //skip: SkipUserPrefix() : SkipUserPrefix() + cgroup, _ = cgroup.SkipSlices() + cgroup, ok := cgroup.SkipUserManager() + if ok { + return cgroup, ok + } + return cgroup.SkipSession() +} + +// Skip cgGetRootPath +func (cgroup _Cgroup) SkipSystemPrefix() (_Cgroup, bool) { + //skip: SkipSystemPrefix() : SkipSystemPrefix() + + rootpath, err := cgGetRootPath() + if err != nil { + return cgroup, false + } + + return cgroup.SkipPath(rootpath) +} |