util/pidowner: new package to map from process ID to its user ID

This commit is contained in:
Brad Fitzpatrick
2020-09-11 08:09:51 -07:00
parent 40e12c17ec
commit 23f01174ea
5 changed files with 146 additions and 0 deletions

View File

@ -0,0 +1,33 @@
package pidowner
import (
"fmt"
"os"
"strings"
"tailscale.com/util/lineread"
)
func ownerOfPID(pid int) (userID string, err error) {
file := fmt.Sprintf("/proc/%d/status", pid)
err = lineread.File(file, func(line []byte) error {
if len(line) < 4 || string(line[:4]) != "Uid:" {
return nil
}
f := strings.Fields(string(line))
if len(f) >= 2 {
userID = f[1] // real userid
}
return nil
})
if os.IsNotExist(err) {
return "", ErrProcessNotFound
}
if err != nil {
return
}
if userID == "" {
return "", fmt.Errorf("missing Uid line in %s", file)
}
return userID, nil
}