| 123456789101112131415161718192021222324252627282930313233343536 |
- // Copyright (c) Tailscale Inc & AUTHORS
- // SPDX-License-Identifier: BSD-3-Clause
- package pidowner
- import (
- "fmt"
- "os"
- "strings"
- "tailscale.com/util/lineiter"
- )
- func ownerOfPID(pid int) (userID string, err error) {
- file := fmt.Sprintf("/proc/%d/status", pid)
- for lr := range lineiter.File(file) {
- line, err := lr.Value()
- if err != nil {
- if os.IsNotExist(err) {
- return "", ErrProcessNotFound
- }
- return "", err
- }
- if len(line) < 4 || string(line[:4]) != "Uid:" {
- continue
- }
- f := strings.Fields(string(line))
- if len(f) >= 2 {
- userID = f[1] // real userid
- }
- }
- if userID == "" {
- return "", fmt.Errorf("missing Uid line in %s", file)
- }
- return userID, nil
- }
|