* ext/etc/etc.c (etc_systmpdir): moved from ext/tmpdir.

* ext/etc/etc.c (etc_sysconfdir): added.

* lib/rubygems/config_file.rb, lib/tmpdir.rb: use etc.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27667 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2010-05-08 03:25:17 +00:00
Родитель 5512c9b287
Коммит 2c01a07bf4
8 изменённых файлов: 75 добавлений и 51 удалений

Просмотреть файл

@ -1,3 +1,11 @@
Sat May 8 12:25:15 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/etc/etc.c (etc_systmpdir): moved from ext/tmpdir.
* ext/etc/etc.c (etc_sysconfdir): added.
* lib/rubygems/config_file.rb, lib/tmpdir.rb: use etc.
Sat May 8 11:07:41 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/bigdecimal/bigdecimal.c (VpAlloc): ensure buf does not get

Просмотреть файл

@ -8,6 +8,7 @@
************************************************/
#include "ruby.h"
#include "ruby/encoding.h"
#include <sys/types.h>
#ifdef HAVE_UNISTD_H
@ -27,6 +28,13 @@ static VALUE sPasswd;
static VALUE sGroup;
#endif
#ifdef _WIN32
#include <shlobj.h>
#ifndef CSIDL_COMMON_APPDATA
#define CSIDL_COMMON_APPDATA 35
#endif
#endif
#ifndef _WIN32
char *getenv();
#endif
@ -549,6 +557,43 @@ etc_getgrent(VALUE obj)
return Qnil;
}
#define numberof(array) (sizeof(array) / sizeof(*array))
#ifdef _WIN32
VALUE rb_w32_special_folder(int type);
UINT rb_w32_system_tmpdir(WCHAR *path, UINT len);
VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc);
#endif
/*
* Returns system configuration directory.
*/
static VALUE
etc_sysconfdir(VALUE obj)
{
#ifdef _WIN32
return rb_w32_special_folder(CSIDL_COMMON_APPDATA);
#else
return rb_filesystem_str_new_cstr(SYSCONFDIR);
#endif
}
/*
* Returns system temporary directory.
*/
static VALUE
etc_systmpdir(void)
{
#ifdef _WIN32
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
}
/*
* The etc module provides access to information from the running OS.
*
@ -575,6 +620,8 @@ Init_etc(void)
rb_define_module_function(mEtc, "setgrent", etc_setgrent, 0);
rb_define_module_function(mEtc, "endgrent", etc_endgrent, 0);
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
rb_define_module_function(mEtc, "sysconfdir", etc_sysconfdir, 0);
rb_define_module_function(mEtc, "systmpdir", etc_systmpdir, 0);
sPasswd = rb_struct_define("Passwd",
"name", "passwd", "uid", "gid",

Просмотреть файл

@ -4,7 +4,9 @@ have_library("sun", "getpwnam") # NIS (== YP) interface for IRIX 4
a = have_func("getlogin")
b = have_func("getpwent")
c = have_func("getgrent")
if a or b or c
sysconfdir = RbConfig.expand(RbConfig::MAKEFILE_CONFIG["sysconfdir"].dup, "prefix"=>"")
$defs.push("-DSYSCONFDIR=#{Shellwords.escape(sysconfdir.dump)}")
if a or b or c or sysconfdir
have_struct_member('struct passwd', 'pw_gecos', 'pwd.h')
have_struct_member('struct passwd', 'pw_change', 'pwd.h')
have_struct_member('struct passwd', 'pw_quota', 'pwd.h')

Просмотреть файл

@ -1,6 +0,0 @@
case
when have_func("rb_w32_system_tmpdir")
ok = true # win32
else
end
create_makefile("tmpdir") if ok

Просмотреть файл

@ -1,32 +0,0 @@
#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()));
}

Просмотреть файл

@ -47,15 +47,8 @@ class Gem::ConfigFile
system_config_path =
begin
require 'Win32API'
CSIDL_COMMON_APPDATA = 0x0023
path = 0.chr * 260
SHGetFolderPath = Win32API.new 'shell32', 'SHGetFolderPath', 'PLPLP', 'L',
:stdcall
SHGetFolderPath.call nil, CSIDL_COMMON_APPDATA, nil, 1, path
path.strip
require 'etc.so'
Etc.sysconfdir
rescue LoadError
'/etc'
end

Просмотреть файл

@ -5,13 +5,14 @@
#
require 'fileutils'
if /mswin|mingw/ =~ RUBY_PLATFORM
require 'tmpdir.so'
begin
require 'etc.so'
rescue LoadError
end
class Dir
@@systmpdir ||= '/tmp'
@@systmpdir ||= defined?(Etc.systmpdir) ? Etc.systmpdir : '/tmp'
##
# Returns the operating system's temporary file path.

Просмотреть файл

@ -68,6 +68,7 @@ static int has_redirection(const char *);
int rb_w32_wait_events(HANDLE *events, int num, DWORD timeout);
static int rb_w32_open_osfhandle(intptr_t osfhandle, int flags);
static int wstati64(const WCHAR *path, struct stati64 *st);
VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc);
#define RUBY_CRITICAL(expr) do { expr; } while (0)
@ -466,6 +467,16 @@ get_system_directory(WCHAR *path, UINT len)
#define numberof(array) (sizeof(array) / sizeof(*array))
VALUE
rb_w32_special_folder(int type)
{
WCHAR path[_MAX_PATH];
if (!get_special_folder(type, path)) return Qnil;
regulate_path(path);
return rb_w32_conv_from_wchar(path, rb_filesystem_encoding());
}
UINT
rb_w32_system_tmpdir(WCHAR *path, UINT len)
{