mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* 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
5 changed files with 66 additions and 37 deletions
|
@ -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.
|
||||
|
||||
|
|
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'
|
||||
begin
|
||||
require 'tmpdir.so'
|
||||
rescue LoadError
|
||||
end
|
||||
|
||||
class Dir
|
||||
|
||||
@@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
|
||||
@@systmpdir ||= '/tmp'
|
||||
|
||||
##
|
||||
# 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))
|
||||
|
||||
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
|
||||
init_env(void)
|
||||
{
|
||||
|
@ -484,15 +500,8 @@ init_env(void)
|
|||
if (!GetEnvironmentVariableW(TMPDIR, env, numberof(env)) &&
|
||||
!GetEnvironmentVariableW(L"TMP", env, numberof(env)) &&
|
||||
!GetEnvironmentVariableW(L"TEMP", env, numberof(env)) &&
|
||||
(get_special_folder(CSIDL_LOCAL_APPDATA, env) ||
|
||||
get_system_directory(env, numberof(env)))) {
|
||||
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);
|
||||
}
|
||||
rb_w32_system_tmpdir(env, numberof(env))) {
|
||||
set_env_val(TMPDIR);
|
||||
}
|
||||
|
||||
#undef env
|
||||
|
|
Loading…
Reference in a new issue