* ext/tmpdir: split from lib/tmpdir.rb.
* win32/win32.c (rb_w32_system_tmpdir): extracted from init_env. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26952 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
724f1f4a6e
commit
3694f1dda7
@ -1,4 +1,8 @@
|
|||||||
Tue Mar 16 14:47:55 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Tue Mar 16 15:20:13 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/tmpdir: split from lib/tmpdir.rb.
|
||||||
|
|
||||||
|
* win32/win32.c (rb_w32_system_tmpdir): extracted from init_env.
|
||||||
|
|
||||||
* win32/win32.c (rb_w32_getcwd): remvoed duplicated code.
|
* win32/win32.c (rb_w32_getcwd): remvoed duplicated code.
|
||||||
|
|
||||||
|
6
ext/tmpdir/extconf.rb
Normal file
6
ext/tmpdir/extconf.rb
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
case
|
||||||
|
when have_func("rb_w32_system_tmpdir")
|
||||||
|
ok = true # win32
|
||||||
|
else
|
||||||
|
end
|
||||||
|
create_makefile("tmpdir") if ok
|
32
ext/tmpdir/tmpdir.c
Normal file
32
ext/tmpdir/tmpdir.c
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#include <ruby/ruby.h>
|
||||||
|
#include <ruby/encoding.h>
|
||||||
|
|
||||||
|
#define numberof(array) (sizeof(array) / sizeof(*array))
|
||||||
|
|
||||||
|
#ifdef HAVE_RB_W32_SYSTEM_TMPDIR
|
||||||
|
UINT rb_w32_system_tmpdir(WCHAR *path, UINT len);
|
||||||
|
VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
system_tmpdir(void)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_RB_W32_SYSTEM_TMPDIR
|
||||||
|
WCHAR path[_MAX_PATH];
|
||||||
|
UINT len = rb_w32_system_tmpdir(path, numberof(path));
|
||||||
|
if (!len) return Qnil;
|
||||||
|
return rb_w32_conv_from_wchar(path, rb_filesystem_encoding());
|
||||||
|
#else
|
||||||
|
return rb_filesystem_str_new_cstr("/tmp");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* sets Dir.@@systmpdir.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
Init_tmpdir(void)
|
||||||
|
{
|
||||||
|
rb_cvar_set(rb_cDir, rb_intern_const("@@systmpdir"),
|
||||||
|
rb_obj_freeze(system_tmpdir()));
|
||||||
|
}
|
@ -5,36 +5,14 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
require 'fileutils'
|
require 'fileutils'
|
||||||
|
begin
|
||||||
|
require 'tmpdir.so'
|
||||||
|
rescue LoadError
|
||||||
|
end
|
||||||
|
|
||||||
class Dir
|
class Dir
|
||||||
|
|
||||||
@@systmpdir = '/tmp'
|
@@systmpdir ||= '/tmp'
|
||||||
|
|
||||||
if /mswin|mingw|cygwin/ =~ RUBY_PLATFORM and
|
|
||||||
begin
|
|
||||||
require 'Win32API'
|
|
||||||
true
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
CSIDL_LOCAL_APPDATA = 0x001c
|
|
||||||
max_pathlen = 260
|
|
||||||
windir = "\0"*(max_pathlen+1)
|
|
||||||
begin
|
|
||||||
getdir = Win32API.new('shell32', 'SHGetFolderPath', 'LLLLP', 'L')
|
|
||||||
raise RuntimeError if getdir.call(0, CSIDL_LOCAL_APPDATA, 0, 0, windir) != 0
|
|
||||||
windir.rstrip!
|
|
||||||
rescue RuntimeError
|
|
||||||
begin
|
|
||||||
getdir = Win32API.new('kernel32', 'GetSystemWindowsDirectory', 'PL', 'L')
|
|
||||||
rescue RuntimeError
|
|
||||||
getdir = Win32API.new('kernel32', 'GetWindowsDirectory', 'PL', 'L')
|
|
||||||
end
|
|
||||||
windir[getdir.call(windir, windir.size)..-1] = ""
|
|
||||||
end
|
|
||||||
windir.force_encoding(Dir.pwd.encoding)
|
|
||||||
temp = File.expand_path('temp', windir.untaint)
|
|
||||||
@@systmpdir = temp if File.directory?(temp) and File.writable?(temp)
|
|
||||||
end
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Returns the operating system's temporary file path.
|
# Returns the operating system's temporary file path.
|
||||||
|
@ -430,6 +430,22 @@ get_system_directory(WCHAR *path, UINT len)
|
|||||||
|
|
||||||
#define numberof(array) (sizeof(array) / sizeof(*array))
|
#define numberof(array) (sizeof(array) / sizeof(*array))
|
||||||
|
|
||||||
|
UINT
|
||||||
|
rb_w32_system_tmpdir(WCHAR *path, UINT len)
|
||||||
|
{
|
||||||
|
static const WCHAR temp[] = L"temp";
|
||||||
|
WCHAR *p;
|
||||||
|
|
||||||
|
if (!get_special_folder(CSIDL_LOCAL_APPDATA, path)) {
|
||||||
|
if (get_system_directory(path, len)) return 0;
|
||||||
|
}
|
||||||
|
p = translate_wchar(path, L'\\', L'/');
|
||||||
|
if (*(p - 1) != L'/') *p++ = L'/';
|
||||||
|
if (p - path + numberof(temp) >= len) return 0;
|
||||||
|
memcpy(p, temp, sizeof(temp));
|
||||||
|
return p - path + numberof(temp) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_env(void)
|
init_env(void)
|
||||||
{
|
{
|
||||||
@ -484,15 +500,8 @@ init_env(void)
|
|||||||
if (!GetEnvironmentVariableW(TMPDIR, env, numberof(env)) &&
|
if (!GetEnvironmentVariableW(TMPDIR, env, numberof(env)) &&
|
||||||
!GetEnvironmentVariableW(L"TMP", env, numberof(env)) &&
|
!GetEnvironmentVariableW(L"TMP", env, numberof(env)) &&
|
||||||
!GetEnvironmentVariableW(L"TEMP", env, numberof(env)) &&
|
!GetEnvironmentVariableW(L"TEMP", env, numberof(env)) &&
|
||||||
(get_special_folder(CSIDL_LOCAL_APPDATA, env) ||
|
rb_w32_system_tmpdir(env, numberof(env))) {
|
||||||
get_system_directory(env, numberof(env)))) {
|
set_env_val(TMPDIR);
|
||||||
static const WCHAR temp[] = L"temp";
|
|
||||||
WCHAR *p = translate_wchar(env, L'\\', L'/');
|
|
||||||
if (*(p - 1) != L'/') *p++ = L'/';
|
|
||||||
if (p - env + numberof(temp) < numberof(env)) {
|
|
||||||
memcpy(p, temp, sizeof(temp));
|
|
||||||
set_env_val(TMPDIR);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef env
|
#undef env
|
||||||
|
Loading…
x
Reference in New Issue
Block a user