29#ifdef HAVE_SYS_UTSNAME_H
30#include <sys/utsname.h>
33#ifdef HAVE_SCHED_GETAFFINITY
44#ifndef CSIDL_COMMON_APPDATA
45#define CSIDL_COMMON_APPDATA 35
55#define RUBY_ETC_VERSION "1.3.0"
57#ifdef HAVE_RB_DEPRECATE_CONSTANT
60# define rb_deprecate_constant(mod,name) ((void)(mod),(void)(name))
65#ifdef HAVE_RUBY_ATOMIC_H
68typedef int rb_atomic_t;
69# define RUBY_ATOMIC_CAS(var, oldval, newval) \
70 ((var) == (oldval) ? ((var) = (newval), (oldval)) : (var))
71# define RUBY_ATOMIC_EXCHANGE(var, newval) \
72 atomic_exchange(&var, newval)
73static inline rb_atomic_t
74atomic_exchange(
volatile rb_atomic_t *var, rb_atomic_t newval)
76 rb_atomic_t oldval = *var;
98etc_getlogin(
VALUE obj)
104 if (!login) login =
getenv(
"USER");
121#if defined(HAVE_GETPWENT) || defined(HAVE_GETGRENT)
123safe_setup_str(
const char *
str)
130safe_setup_locale_str(
const char *
str)
137safe_setup_filesystem_str(
const char *
str)
146# define PW_TIME2VAL(t) INT2NUM((int)(t))
148# define PW_TIME2VAL(t) TIMET2NUM(t)
152setup_passwd(
struct passwd *pwd)
156 safe_setup_locale_str(pwd->pw_name),
157#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
158 safe_setup_str(pwd->pw_passwd),
162#ifdef HAVE_STRUCT_PASSWD_PW_GECOS
163 safe_setup_locale_str(pwd->pw_gecos),
165 safe_setup_filesystem_str(pwd->pw_dir),
166 safe_setup_filesystem_str(pwd->pw_shell),
167#ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
168 PW_TIME2VAL(pwd->pw_change),
170#ifdef HAVE_STRUCT_PASSWD_PW_QUOTA
173#ifdef HAVE_STRUCT_PASSWD_PW_AGE
174 PW_AGE2VAL(pwd->pw_age),
176#ifdef HAVE_STRUCT_PASSWD_PW_CLASS
177 safe_setup_locale_str(pwd->pw_class),
179#ifdef HAVE_STRUCT_PASSWD_PW_COMMENT
180 safe_setup_locale_str(pwd->pw_comment),
182#ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
183 PW_TIME2VAL(pwd->pw_expire),
210#if defined(HAVE_GETPWENT)
223 return setup_passwd(pwd);
253 return setup_passwd(pwd);
260static rb_atomic_t passwd_blocking;
265 if (RUBY_ATOMIC_EXCHANGE(passwd_blocking, 0) != 1) {
277 while ((pw = getpwent()) != 0) {
286 if (RUBY_ATOMIC_CAS(passwd_blocking, 0, 1)) {
289 rb_ensure(passwd_iterate, 0, passwd_ensure, 0);
322 else if ((pw = getpwent()) != 0) {
323 return setup_passwd(pw);
354etc_each_passwd(
VALUE obj)
367etc_setpwent(
VALUE obj)
379etc_endpwent(
VALUE obj)
399etc_getpwent(
VALUE obj)
404 if ((pw = getpwent()) != 0) {
405 return setup_passwd(pw);
413setup_group(
struct group *grp)
425 safe_setup_locale_str(grp->gr_name),
426#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
427 safe_setup_str(grp->gr_passwd),
466 return setup_group(grp);
497 return setup_group(grp);
504static rb_atomic_t group_blocking;
509 if (RUBY_ATOMIC_EXCHANGE(group_blocking, 0) != 1) {
522 while ((pw = getgrent()) != 0) {
531 if (RUBY_ATOMIC_CAS(group_blocking, 0, 1)) {
534 rb_ensure(group_iterate, 0, group_ensure, 0);
563 else if ((grp = getgrent()) != 0) {
564 return setup_group(grp);
594etc_each_group(
VALUE obj)
606etc_setgrent(
VALUE obj)
618etc_endgrent(
VALUE obj)
637etc_getgrent(
VALUE obj)
642 if ((gr = getgrent()) != 0) {
643 return setup_group(gr);
649#define numberof(array) (sizeof(array) / sizeof(*(array)))
666etc_sysconfdir(
VALUE obj)
683 WCHAR path[_MAX_PATH];
688 const char default_tmp[] =
"/tmp";
689 const char *tmpstr = default_tmp;
690 size_t tmplen =
strlen(default_tmp);
691# if defined _CS_DARWIN_USER_TEMP_DIR
693 #define MAXPATHLEN 1024
697 len = confstr(_CS_DARWIN_USER_TEMP_DIR, path,
sizeof(path));
701 if (
len >
sizeof(path)) tmpstr = 0;
705# if defined _CS_DARWIN_USER_TEMP_DIR
711#ifndef RB_PASS_KEYWORDS
744 const char *sysname, *mach;
745 VALUE result, release, version;
750 v.dwOSVersionInfoSize =
sizeof(v);
751 if (!GetVersionExW(&v))
755 switch (v.dwPlatformId) {
756 case VER_PLATFORM_WIN32s:
759 case VER_PLATFORM_WIN32_NT:
760 sysname =
"Windows_NT";
762 case VER_PLATFORM_WIN32_WINDOWS:
768 release =
rb_sprintf(
"%lu.%lu.%lu", v.dwMajorVersion, v.dwMinorVersion, v.dwBuildNumber);
774# if defined _MSC_VER && _MSC_VER < 1300
775# define GET_COMPUTER_NAME(ptr, plen) GetComputerNameW(ptr, plen)
777# define GET_COMPUTER_NAME(ptr, plen) GetComputerNameExW(ComputerNameDnsFullyQualified, ptr, plen)
781 if (GET_COMPUTER_NAME(
buf, &
len)) {
788# ifndef PROCESSOR_ARCHITECTURE_AMD64
789# define PROCESSOR_ARCHITECTURE_AMD64 9
791# ifndef PROCESSOR_ARCHITECTURE_INTEL
792# define PROCESSOR_ARCHITECTURE_INTEL 0
795 switch (s.wProcessorArchitecture) {
796 case PROCESSOR_ARCHITECTURE_AMD64:
799 case PROCESSOR_ARCHITECTURE_ARM:
802 case PROCESSOR_ARCHITECTURE_INTEL:
831#define etc_uname rb_f_notimplement
865#define etc_sysconf rb_f_notimplement
888 char localbuf[128], *
buf = localbuf;
889 size_t bufsize =
sizeof(localbuf), ret;
895 ret = confstr(
name,
buf, bufsize);
900 ret = confstr(
name,
buf, bufsize);
903 rb_bug(
"required buffer size for confstr() changed dynamically.");
912#define etc_confstr rb_f_notimplement
942 ret = fpathconf(fptr->
fd,
name);
951#define io_pathconf rb_f_notimplement
954#if (defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)) || defined(_WIN32)
956#if defined(HAVE_SCHED_GETAFFINITY) && defined(CPU_ALLOC)
958etc_nprocessors_affin(
void)
960 cpu_set_t *cpuset, cpuset_buff[1024 /
sizeof(cpu_set_t)];
965 CPU_ZERO_S(
sizeof(cpuset_buff), cpuset_buff);
983 for (n=64; n <= 16384; n *= 2) {
984 size = CPU_ALLOC_SIZE(n);
985 if (
size >=
sizeof(cpuset_buff)) {
990 cpuset = cpuset_buff;
993 ret = sched_getaffinity(0,
size, cpuset);
996 ret = CPU_COUNT_S(
size, cpuset);
999 if (
size >=
sizeof(cpuset_buff)) {
1002 if (ret > 0 || errno != EINVAL) {
1042#if defined(HAVE_SCHED_GETAFFINITY) && defined(CPU_ALLOC)
1045 ncpus = etc_nprocessors_affin();
1053 ret = sysconf(_SC_NPROCESSORS_ONLN);
1060 ret = (
long)si.dwNumberOfProcessors;
1065#define etc_nprocessors rb_f_notimplement
1099 #ifdef HAVE_RB_EXT_RACTOR_SAFE
1104 init_constants(mEtc);
1131#ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
1136#ifdef HAVE_STRUCT_PASSWD_PW_GECOS
1141#ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
1144#ifdef HAVE_STRUCT_PASSWD_PW_QUOTA
1147#ifdef HAVE_STRUCT_PASSWD_PW_AGE
1150#ifdef HAVE_STRUCT_PASSWD_PW_CLASS
1153#ifdef HAVE_STRUCT_PASSWD_PW_COMMENT
1156#ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
1208#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
1211 "gid",
"mem",
NULL);
VALUE rb_ary_push(VALUE ary, VALUE item)
#define rb_define_method(klass, mid, func, arity)
Defines klass#mid.
#define rb_define_singleton_method(klass, mid, func, arity)
Defines klass.mid.
#define rb_define_module_function(klass, mid, func, arity)
Defines klass#mid and makes it a module function.
rb_encoding * rb_utf8_encoding(void)
rb_encoding * rb_filesystem_encoding(void)
rb_encoding * rb_locale_encoding(void)
char str[HTML_ESCAPE_MAX_LEN+1]
#define rb_deprecate_constant(mod, name)
#define RSTRING_PTR(string)
void rb_extend_object(VALUE obj, VALUE module)
Extend the object with the module.
VALUE rb_define_module(const char *name)
int rb_scan_args(int argc, const VALUE *argv, const char *fmt,...)
int rb_block_given_p(void)
Determines if the current method is given a block.
void rb_raise(VALUE exc, const char *fmt,...)
void rb_bug(const char *fmt,...)
VALUE rb_ensure(VALUE(*b_proc)(VALUE), VALUE data1, VALUE(*e_proc)(VALUE), VALUE data2)
An equivalent to ensure clause.
void rb_sys_fail(const char *mesg)
VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val)
VALUE rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *)
#define RETURN_ENUMERATOR(obj, argc, argv)
#define RB_EXT_RACTOR_SAFE(f)
#define rb_str_new(str, len)
VALUE rb_filesystem_str_new(const char *, long)
VALUE rb_filesystem_str_new_cstr(const char *)
#define rb_locale_str_new_cstr(str)
#define rb_str_new_cstr(str)
VALUE rb_struct_define_under(VALUE, const char *,...)
VALUE rb_struct_new(VALUE,...)
ID rb_intern(const char *)
void rb_define_const(VALUE, const char *, VALUE)
typedef long(ZCALLBACK *tell_file_func) OF((voidpf opaque
VALUE type(ANYARGS)
ANYARGS-ed function type.
#define StringValueCStr(v)
VALUE rb_sprintf(const char *,...)
size_t strlen(const char *)
VALUE rb_w32_special_folder(int type)
#define CSIDL_COMMON_APPDATA
VALUE rb_w32_conv_from_wchar(const WCHAR *wstr, rb_encoding *enc)
UINT rb_w32_system_tmpdir(WCHAR *path, UINT len)