file.c: home directory from system
* file.c (rb_default_home_dir): resolve home directory from the system database when HOME is not set. [Feature #12695] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56902 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
58742627af
commit
6b88dd2698
22
file.c
22
file.c
@ -3221,17 +3221,37 @@ rb_home_dir_of(VALUE user, VALUE result)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
VALUE
|
VALUE
|
||||||
rb_default_home_dir(VALUE result)
|
rb_default_home_dir(VALUE result)
|
||||||
{
|
{
|
||||||
const char *dir = getenv("HOME");
|
const char *dir = getenv("HOME");
|
||||||
|
|
||||||
|
#if defined HAVE_PWD_H
|
||||||
|
if (!dir) {
|
||||||
|
const char *login = getlogin();
|
||||||
|
if (login) {
|
||||||
|
struct passwd *pw = getpwnam(login);
|
||||||
|
if (pw) {
|
||||||
|
copy_home_path(result, pw->pw_dir);
|
||||||
|
endpwent();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
endpwent();
|
||||||
|
rb_raise(rb_eArgError, "couldn't find HOME for login `%s' -- expanding `~'",
|
||||||
|
login);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rb_raise(rb_eArgError, "couldn't find login name -- expanding `~'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
if (!dir) {
|
if (!dir) {
|
||||||
rb_raise(rb_eArgError, "couldn't find HOME environment -- expanding `~'");
|
rb_raise(rb_eArgError, "couldn't find HOME environment -- expanding `~'");
|
||||||
}
|
}
|
||||||
return copy_home_path(result, dir);
|
return copy_home_path(result, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
static VALUE
|
static VALUE
|
||||||
ospath_new(const char *ptr, long len, rb_encoding *fsenc)
|
ospath_new(const char *ptr, long len, rb_encoding *fsenc)
|
||||||
{
|
{
|
||||||
|
@ -289,8 +289,6 @@ class TestDir < Test::Unit::TestCase
|
|||||||
ENV.delete("HOME")
|
ENV.delete("HOME")
|
||||||
ENV.delete("LOGDIR")
|
ENV.delete("LOGDIR")
|
||||||
|
|
||||||
assert_raise(ArgumentError) { Dir.home }
|
|
||||||
assert_raise(ArgumentError) { Dir.home("") }
|
|
||||||
ENV["HOME"] = @nodir
|
ENV["HOME"] = @nodir
|
||||||
assert_nothing_raised(ArgumentError) {
|
assert_nothing_raised(ArgumentError) {
|
||||||
assert_equal(@nodir, Dir.home)
|
assert_equal(@nodir, Dir.home)
|
||||||
|
@ -827,7 +827,6 @@ class TestFileExhaustive < Test::Unit::TestCase
|
|||||||
ENV["HOMEDRIVE"] = nil
|
ENV["HOMEDRIVE"] = nil
|
||||||
ENV["HOMEPATH"] = nil
|
ENV["HOMEPATH"] = nil
|
||||||
ENV["USERPROFILE"] = nil
|
ENV["USERPROFILE"] = nil
|
||||||
assert_raise(ArgumentError) { File.expand_path("~") }
|
|
||||||
ENV["HOME"] = "~"
|
ENV["HOME"] = "~"
|
||||||
assert_raise(ArgumentError, bug3630) { File.expand_path("~") }
|
assert_raise(ArgumentError, bug3630) { File.expand_path("~") }
|
||||||
ENV["HOME"] = "."
|
ENV["HOME"] = "."
|
||||||
|
13
win32/file.c
13
win32/file.c
@ -236,6 +236,19 @@ append_wstr(VALUE dst, const WCHAR *ws, ssize_t len, UINT cp, rb_encoding *enc)
|
|||||||
return dst;
|
return dst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VALUE
|
||||||
|
rb_default_home_dir(VALUE result)
|
||||||
|
{
|
||||||
|
const WCHAR *dir = rb_w32_home_dir();
|
||||||
|
if (!dir) {
|
||||||
|
rb_raise(rb_eArgError, "couldn't find HOME environment -- expanding `~'");
|
||||||
|
}
|
||||||
|
append_wstr(result, dir, -1,
|
||||||
|
rb_w32_filecp(), rb_filesystem_encoding());
|
||||||
|
xfree(dir);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_name, VALUE result)
|
rb_file_expand_path_internal(VALUE fname, VALUE dname, int abs_mode, int long_name, VALUE result)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user