1
0
Fork 0
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:
nobu 2010-03-16 06:20:23 +00:00
parent 724f1f4a6e
commit 3694f1dda7
5 changed files with 66 additions and 37 deletions

View file

@ -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
View 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
View 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()));
}

View file

@ -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.

View file

@ -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