mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 00:01:40 +01:00 
			
		
		
		
	This adds a new generic result type (motivated by golang/go#70084) to try it out, and uses it in the new lineutil package (replacing the old lineread package), changing that package to return iterators: sometimes over []byte (when the input is all in memory), but sometimes iterators over results of []byte, if errors might happen at runtime. Updates #12912 Updates golang/go#70084 Change-Id: Iacdc1070e661b5fb163907b1e8b07ac7d51d3f83 Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
		
			
				
	
	
		
			37 lines
		
	
	
		
			700 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			700 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| // 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
 | |
| }
 |