14 #include <sys/types.h>
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.1.0"
81 if (!login) login =
getenv(
"USER");
98 #if defined(HAVE_GETPWENT) || defined(HAVE_GETGRENT)
100 safe_setup_str(
const char *
str)
107 safe_setup_locale_str(
const char *
str)
114 safe_setup_filesystem_str(
const char *
str)
123 setup_passwd(
struct passwd *pwd)
127 safe_setup_locale_str(pwd->pw_name),
128 #ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
129 safe_setup_str(pwd->pw_passwd),
133 #ifdef HAVE_STRUCT_PASSWD_PW_GECOS
134 safe_setup_locale_str(pwd->pw_gecos),
136 safe_setup_filesystem_str(pwd->pw_dir),
137 safe_setup_filesystem_str(pwd->pw_shell),
138 #ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
141 #ifdef HAVE_STRUCT_PASSWD_PW_QUOTA
144 #ifdef HAVE_STRUCT_PASSWD_PW_AGE
145 PW_AGE2VAL(pwd->pw_age),
147 #ifdef HAVE_STRUCT_PASSWD_PW_CLASS
148 safe_setup_locale_str(pwd->pw_class),
150 #ifdef HAVE_STRUCT_PASSWD_PW_COMMENT
151 safe_setup_locale_str(pwd->pw_comment),
153 #ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
181 #if defined(HAVE_GETPWENT)
194 return setup_passwd(pwd);
224 return setup_passwd(pwd);
231 static int passwd_blocking = 0;
246 while ((pw = getpwent()) != 0) {
255 if (passwd_blocking) {
259 rb_ensure(passwd_iterate, 0, passwd_ensure, 0);
292 else if ((pw = getpwent()) != 0) {
293 return setup_passwd(pw);
374 if ((pw = getpwent()) != 0) {
375 return setup_passwd(pw);
383 setup_group(
struct group *grp)
395 safe_setup_locale_str(grp->gr_name),
396 #ifdef HAVE_STRUCT_GROUP_GR_PASSWD
397 safe_setup_str(grp->gr_passwd),
436 return setup_group(grp);
467 return setup_group(grp);
474 static int group_blocking = 0;
490 while ((pw = getgrent()) != 0) {
499 if (group_blocking) {
503 rb_ensure(group_iterate, 0, group_ensure, 0);
532 else if ((grp = getgrent()) != 0) {
533 return setup_group(grp);
611 if ((gr = getgrent()) != 0) {
612 return setup_group(gr);
618 #define numberof(array) (sizeof(array) / sizeof(*(array)))
652 WCHAR
path[_MAX_PATH];
657 const char default_tmp[] =
"/tmp";
658 const char *tmpstr = default_tmp;
659 size_t tmplen =
strlen(default_tmp);
660 # if defined _CS_DARWIN_USER_TEMP_DIR
662 #define MAXPATHLEN 1024
670 if (
len >
sizeof(
path)) tmpstr = 0;
674 # if defined _CS_DARWIN_USER_TEMP_DIR
680 #ifndef RB_PASS_KEYWORDS
713 const char *sysname, *mach;
714 VALUE result, release, version;
719 v.dwOSVersionInfoSize =
sizeof(
v);
720 if (!GetVersionExW(&
v))
724 switch (
v.dwPlatformId) {
725 case VER_PLATFORM_WIN32s:
728 case VER_PLATFORM_WIN32_NT:
729 sysname =
"Windows_NT";
731 case VER_PLATFORM_WIN32_WINDOWS:
737 release =
rb_sprintf(
"%lu.%lu.%lu",
v.dwMajorVersion,
v.dwMinorVersion,
v.dwBuildNumber);
743 # if defined _MSC_VER && _MSC_VER < 1300
744 # define GET_COMPUTER_NAME(ptr, plen) GetComputerNameW(ptr, plen)
746 # define GET_COMPUTER_NAME(ptr, plen) GetComputerNameExW(ComputerNameDnsFullyQualified, ptr, plen)
750 if (GET_COMPUTER_NAME(
buf, &
len)) {
757 # ifndef PROCESSOR_ARCHITECTURE_AMD64
758 # define PROCESSOR_ARCHITECTURE_AMD64 9
760 # ifndef PROCESSOR_ARCHITECTURE_INTEL
761 # define PROCESSOR_ARCHITECTURE_INTEL 0
764 switch (s.wProcessorArchitecture) {
765 case PROCESSOR_ARCHITECTURE_AMD64:
768 case PROCESSOR_ARCHITECTURE_ARM:
771 case PROCESSOR_ARCHITECTURE_INTEL:
800 #define etc_uname rb_f_notimplement
834 #define etc_sysconf rb_f_notimplement
857 char localbuf[128], *
buf = localbuf;
858 size_t bufsize =
sizeof(localbuf), ret;
872 rb_bug(
"required buffer size for confstr() changed dynamically.");
881 #define etc_confstr rb_f_notimplement
884 #ifdef HAVE_FPATHCONF
920 #define io_pathconf rb_f_notimplement
923 #if (defined(HAVE_SYSCONF) && defined(_SC_NPROCESSORS_ONLN)) || defined(_WIN32)
925 #if defined(HAVE_SCHED_GETAFFINITY) && defined(CPU_ALLOC)
927 etc_nprocessors_affin(
void)
950 for (
n=64;
n <= 16384;
n *= 2) {
951 size = CPU_ALLOC_SIZE(
n);
958 CPU_ZERO_S(
size, cpuset);
961 ret = sched_getaffinity(0,
size, cpuset);
964 ret = CPU_COUNT_S(
size, cpuset);
1008 #if !defined(_WIN32)
1010 #if defined(HAVE_SCHED_GETAFFINITY) && defined(CPU_ALLOC)
1013 ncpus = etc_nprocessors_affin();
1028 ret = (
long)si.dwNumberOfProcessors;
1033 #define etc_nprocessors rb_f_notimplement
1069 init_constants(mEtc);
1096 #ifdef HAVE_STRUCT_PASSWD_PW_PASSWD
1101 #ifdef HAVE_STRUCT_PASSWD_PW_GECOS
1106 #ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
1109 #ifdef HAVE_STRUCT_PASSWD_PW_QUOTA
1112 #ifdef HAVE_STRUCT_PASSWD_PW_AGE
1115 #ifdef HAVE_STRUCT_PASSWD_PW_CLASS
1118 #ifdef HAVE_STRUCT_PASSWD_PW_COMMENT
1121 #ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
1171 #ifdef HAVE_GETGRENT
1173 #ifdef HAVE_STRUCT_GROUP_GR_PASSWD
1176 "gid",
"mem",
NULL);