Browse code

Remove the os.user dependency and manually lookup /etc/passwd instead

Guillaume J. Charmes authored on 2013/07/02 08:48:59
Showing 2 changed files
... ...
@@ -3,10 +3,10 @@ package docker
3 3
 import (
4 4
 	"flag"
5 5
 	"fmt"
6
+	"github.com/dotcloud/docker/utils"
6 7
 	"log"
7 8
 	"os"
8 9
 	"os/exec"
9
-	"os/user"
10 10
 	"strconv"
11 11
 	"strings"
12 12
 	"syscall"
... ...
@@ -27,10 +27,7 @@ func changeUser(u string) {
27 27
 	if u == "" {
28 28
 		return
29 29
 	}
30
-	userent, err := user.LookupId(u)
31
-	if err != nil {
32
-		userent, err = user.Lookup(u)
33
-	}
30
+	userent, err := utils.UserLookup(u)
34 31
 	if err != nil {
35 32
 		log.Fatalf("Unable to find user %v: %v", u, err)
36 33
 	}
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"net/http"
15 15
 	"os"
16 16
 	"os/exec"
17
+	"os/user"
17 18
 	"path/filepath"
18 19
 	"runtime"
19 20
 	"strconv"
... ...
@@ -700,3 +701,23 @@ func ParseRepositoryTag(repos string) (string, string) {
700 700
 	}
701 701
 	return repos, ""
702 702
 }
703
+
704
+func UserLookup(uid string) (*user.User, error) {
705
+	file, err := ioutil.ReadFile("/etc/passwd")
706
+	if err != nil {
707
+		return nil, err
708
+	}
709
+	for _, line := range strings.Split(string(file), "\n") {
710
+		data := strings.Split(line, ":")
711
+		if len(data) > 5 && (data[0] == uid || data[2] == uid) {
712
+			return &user.User{
713
+				Uid:      data[2],
714
+				Gid:      data[3],
715
+				Username: data[0],
716
+				Name:     data[4],
717
+				HomeDir:  data[5],
718
+			}, nil
719
+		}
720
+	}
721
+	return nil, fmt.Errorf("User not found in /etc/passwd")
722
+}