From eb38750d99d4f9706cb2abcb861c84e1d309bd40 Mon Sep 17 00:00:00 2001 From: "Guillaume J. Charmes" Date: Mon, 1 Jul 2013 16:48:59 -0700 Subject: [PATCH] Remove the os.user dependency and manually lookup /etc/passwd instead --- sysinit.go | 7 ++----- utils/utils.go | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/sysinit.go b/sysinit.go index 622dbdf09..fb36cd254 100644 --- a/sysinit.go +++ b/sysinit.go @@ -3,10 +3,10 @@ package docker import ( "flag" "fmt" + "github.com/dotcloud/docker/utils" "log" "os" "os/exec" - "os/user" "strconv" "strings" "syscall" @@ -27,10 +27,7 @@ func changeUser(u string) { if u == "" { return } - userent, err := user.LookupId(u) - if err != nil { - userent, err = user.Lookup(u) - } + userent, err := utils.UserLookup(u) if err != nil { log.Fatalf("Unable to find user %v: %v", u, err) } diff --git a/utils/utils.go b/utils/utils.go index df615844a..ea5c08e60 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -14,6 +14,7 @@ import ( "net/http" "os" "os/exec" + "os/user" "path/filepath" "runtime" "strconv" @@ -700,3 +701,23 @@ func ParseRepositoryTag(repos string) (string, string) { } return repos, "" } + +func UserLookup(uid string) (*user.User, error) { + file, err := ioutil.ReadFile("/etc/passwd") + if err != nil { + return nil, err + } + for _, line := range strings.Split(string(file), "\n") { + data := strings.Split(line, ":") + if len(data) > 5 && (data[0] == uid || data[2] == uid) { + return &user.User{ + Uid: data[2], + Gid: data[3], + Username: data[0], + Name: data[4], + HomeDir: data[5], + }, nil + } + } + return nil, fmt.Errorf("User not found in /etc/passwd") +}