Browse Source

os/user: use stdlib version of this package

I tried implementing enough CGo support to get the native os/user
package to work. But I hit a few bugs, probably in CGo itself. Then I
realized I could just as well set the osusergo build tag to disable CGo
for this specific case.

This actually gets the os/user package to work correctly on Linux (I
confirmed it returns my name/uid/homedir etc). On other systems, it
probably just returns an error if it can't determine these kinds of
things. But that's no worse than the current behavior which just doesn't
do anything at all.
pull/4414/head
Ayke van Laethem 4 months ago
committed by Ron Evans
parent
commit
bf8d6460da
  1. 2
      GNUmakefile
  2. 1
      compileopts/config.go
  3. 1
      loader/goroot.go
  4. 59
      src/os/user/user.go

2
GNUmakefile

@ -378,6 +378,7 @@ TEST_PACKAGES_LINUX := \
io/ioutil \
mime/quotedprintable \
net \
os/user \
strconv \
testing/fstest \
text/tabwriter \
@ -388,6 +389,7 @@ TEST_PACKAGES_DARWIN := $(TEST_PACKAGES_LINUX)
TEST_PACKAGES_WINDOWS := \
compress/flate \
crypto/hmac \
os/user \
strconv \
text/template/parse \
$(nil)

1
compileopts/config.go

@ -84,6 +84,7 @@ func (c *Config) BuildTags() []string {
tags = append(tags, []string{
"tinygo", // that's the compiler
"purego", // to get various crypto packages to work
"osusergo", // to get os/user to work
"math_big_pure_go", // to get math/big to work
"gc." + c.GC(), "scheduler." + c.Scheduler(), // used inside the runtime package
"serial." + c.Serial()}...) // used inside the machine package

1
loader/goroot.go

@ -247,7 +247,6 @@ func pathsToOverride(goMinor int, needsSyscallPackage bool) map[string]bool {
"net/": true,
"net/http/": false,
"os/": true,
"os/user/": false,
"reflect/": false,
"runtime/": false,
"sync/": true,

59
src/os/user/user.go

@ -1,59 +0,0 @@
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package user
import "errors"
// User represents a user account.
type User struct {
// Uid is the user ID.
// On POSIX systems, this is a decimal number representing the uid.
// On Windows, this is a security identifier (SID) in a string format.
// On Plan 9, this is the contents of /dev/user.
Uid string
// Gid is the primary group ID.
// On POSIX systems, this is a decimal number representing the gid.
// On Windows, this is a SID in a string format.
// On Plan 9, this is the contents of /dev/user.
Gid string
// Username is the login name.
Username string
// Name is the user's real or display name.
// It might be blank.
// On POSIX systems, this is the first (or only) entry in the GECOS field
// list.
// On Windows, this is the user's display name.
// On Plan 9, this is the contents of /dev/user.
Name string
// HomeDir is the path to the user's home directory (if they have one).
HomeDir string
}
// Current returns the current user.
//
// The first call will cache the current user information.
// Subsequent calls will return the cached value and will not reflect
// changes to the current user.
func Current() (*User, error) {
return nil, errors.New("user: Current not implemented")
}
// Lookup always returns an error.
func Lookup(username string) (*User, error) {
return nil, errors.New("user: Lookup not implemented")
}
// Group represents a grouping of users.
//
// On POSIX systems Gid contains a decimal number representing the group ID.
type Group struct {
Gid string // group ID
Name string // group name
}
// LookupGroup always returns an error.
func LookupGroup(name string) (*Group, error) {
return nil, errors.New("user: LookupGroup not implemented")
}
Loading…
Cancel
Save