etc 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +0 -2
- data/ext/etc/etc.c +48 -12
- data/ext/etc/extconf.rb +5 -0
- data/test/etc/test_etc.rb +25 -2
- metadata +7 -7
- data/stub/etc.rb +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f5196e40206894d4fc74d486106863f351e131e89fa6017807542361a09c617
|
4
|
+
data.tar.gz: 131ade148fb05d021a9956ee282722012abbc0607f87bfa15bd06a0374264a4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 210712686ace4800e20dbc1c4f97ead9a352f6d65dc794bb0033f55da286ec730bef1269f5b9479b4f600a87a55a31470f7596b83ddc705aeb5f194618646e37
|
7
|
+
data.tar.gz: aa0cba8840eb405a1b80339d82c44b2c582e97b2cab1db8d7ad05f315ac1a78325c421698b94a53283302702f5ea2a669221bfbf84f0be88bf880fc863ade405
|
data/README.md
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# Etc
|
2
2
|
|
3
|
-
[![Build Status](https://travis-ci.org/ruby/etc.svg?branch=master)](https://travis-ci.org/ruby/etc)
|
4
|
-
|
5
3
|
The Etc module provides access to information typically stored in files in the /etc directory on Unix systems.
|
6
4
|
|
7
5
|
The information accessible consists of the information found in the `/etc/passwd` and `/etc/group` files, plus information about he system's temporary directory (/tmp) and configuration directory (/etc).
|
data/ext/etc/etc.c
CHANGED
@@ -52,10 +52,34 @@ char *getenv();
|
|
52
52
|
#endif
|
53
53
|
char *getlogin();
|
54
54
|
|
55
|
-
#define RUBY_ETC_VERSION "1.
|
55
|
+
#define RUBY_ETC_VERSION "1.2.0"
|
56
|
+
|
57
|
+
#ifdef HAVE_RB_DEPRECATE_CONSTANT
|
58
|
+
void rb_deprecate_constant(VALUE mod, const char *name);
|
59
|
+
#else
|
60
|
+
# define rb_deprecate_constant(mod,name) ((void)(mod),(void)(name))
|
61
|
+
#endif
|
56
62
|
|
57
63
|
#include "constdefs.h"
|
58
64
|
|
65
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
66
|
+
#include "ruby/thread_native.h"
|
67
|
+
#else
|
68
|
+
/* Implement rb_native_mutex_x using an int */
|
69
|
+
typedef int rb_nativethread_lock_t;
|
70
|
+
static int rb_native_mutex_trylock(int *mutex) {
|
71
|
+
if (*mutex) {
|
72
|
+
return 1;
|
73
|
+
}
|
74
|
+
*mutex = 1;
|
75
|
+
return 0;
|
76
|
+
}
|
77
|
+
static void rb_native_mutex_unlock(int *mutex) {
|
78
|
+
*mutex = 0;
|
79
|
+
}
|
80
|
+
#define rb_native_mutex_initialize rb_native_mutex_unlock
|
81
|
+
#endif
|
82
|
+
|
59
83
|
/* call-seq:
|
60
84
|
* getlogin -> String
|
61
85
|
*
|
@@ -119,6 +143,12 @@ safe_setup_filesystem_str(const char *str)
|
|
119
143
|
#endif
|
120
144
|
|
121
145
|
#ifdef HAVE_GETPWENT
|
146
|
+
# ifdef __APPLE__
|
147
|
+
# define PW_TIME2VAL(t) INT2NUM((int)(t))
|
148
|
+
# else
|
149
|
+
# define PW_TIME2VAL(t) TIMET2NUM(t)
|
150
|
+
# endif
|
151
|
+
|
122
152
|
static VALUE
|
123
153
|
setup_passwd(struct passwd *pwd)
|
124
154
|
{
|
@@ -136,7 +166,7 @@ setup_passwd(struct passwd *pwd)
|
|
136
166
|
safe_setup_filesystem_str(pwd->pw_dir),
|
137
167
|
safe_setup_filesystem_str(pwd->pw_shell),
|
138
168
|
#ifdef HAVE_STRUCT_PASSWD_PW_CHANGE
|
139
|
-
|
169
|
+
PW_TIME2VAL(pwd->pw_change),
|
140
170
|
#endif
|
141
171
|
#ifdef HAVE_STRUCT_PASSWD_PW_QUOTA
|
142
172
|
INT2NUM(pwd->pw_quota),
|
@@ -151,7 +181,7 @@ setup_passwd(struct passwd *pwd)
|
|
151
181
|
safe_setup_locale_str(pwd->pw_comment),
|
152
182
|
#endif
|
153
183
|
#ifdef HAVE_STRUCT_PASSWD_PW_EXPIRE
|
154
|
-
|
184
|
+
PW_TIME2VAL(pwd->pw_expire),
|
155
185
|
#endif
|
156
186
|
0 /*dummy*/
|
157
187
|
);
|
@@ -228,12 +258,12 @@ etc_getpwnam(VALUE obj, VALUE nam)
|
|
228
258
|
}
|
229
259
|
|
230
260
|
#ifdef HAVE_GETPWENT
|
231
|
-
static
|
261
|
+
static rb_nativethread_lock_t passwd_blocking;
|
232
262
|
static VALUE
|
233
263
|
passwd_ensure(VALUE _)
|
234
264
|
{
|
235
265
|
endpwent();
|
236
|
-
passwd_blocking
|
266
|
+
rb_native_mutex_unlock(&passwd_blocking);
|
237
267
|
return Qnil;
|
238
268
|
}
|
239
269
|
|
@@ -252,10 +282,9 @@ passwd_iterate(VALUE _)
|
|
252
282
|
static void
|
253
283
|
each_passwd(void)
|
254
284
|
{
|
255
|
-
if (passwd_blocking) {
|
285
|
+
if (rb_native_mutex_trylock(&passwd_blocking)) {
|
256
286
|
rb_raise(rb_eRuntimeError, "parallel passwd iteration");
|
257
287
|
}
|
258
|
-
passwd_blocking = (int)Qtrue;
|
259
288
|
rb_ensure(passwd_iterate, 0, passwd_ensure, 0);
|
260
289
|
}
|
261
290
|
#endif
|
@@ -471,12 +500,12 @@ etc_getgrnam(VALUE obj, VALUE nam)
|
|
471
500
|
}
|
472
501
|
|
473
502
|
#ifdef HAVE_GETGRENT
|
474
|
-
static
|
503
|
+
static rb_nativethread_lock_t group_blocking;
|
475
504
|
static VALUE
|
476
505
|
group_ensure(VALUE _)
|
477
506
|
{
|
478
507
|
endgrent();
|
479
|
-
group_blocking
|
508
|
+
rb_native_mutex_unlock(&group_blocking);
|
480
509
|
return Qnil;
|
481
510
|
}
|
482
511
|
|
@@ -496,10 +525,9 @@ group_iterate(VALUE _)
|
|
496
525
|
static void
|
497
526
|
each_group(void)
|
498
527
|
{
|
499
|
-
if (group_blocking) {
|
528
|
+
if (rb_native_mutex_trylock(&group_blocking)) {
|
500
529
|
rb_raise(rb_eRuntimeError, "parallel group iteration");
|
501
530
|
}
|
502
|
-
group_blocking = (int)Qtrue;
|
503
531
|
rb_ensure(group_iterate, 0, group_ensure, 0);
|
504
532
|
}
|
505
533
|
#endif
|
@@ -1064,6 +1092,9 @@ Init_etc(void)
|
|
1064
1092
|
{
|
1065
1093
|
VALUE mEtc;
|
1066
1094
|
|
1095
|
+
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
1096
|
+
RB_EXT_RACTOR_SAFE(true);
|
1097
|
+
#endif
|
1067
1098
|
mEtc = rb_define_module("Etc");
|
1068
1099
|
rb_define_const(mEtc, "VERSION", rb_str_new_cstr(RUBY_ETC_VERSION));
|
1069
1100
|
init_constants(mEtc);
|
@@ -1165,10 +1196,14 @@ Init_etc(void)
|
|
1165
1196
|
rb_define_const(mEtc, "Passwd", sPasswd);
|
1166
1197
|
#endif
|
1167
1198
|
rb_define_const(rb_cStruct, "Passwd", sPasswd); /* deprecated name */
|
1199
|
+
rb_deprecate_constant(rb_cStruct, "Passwd");
|
1168
1200
|
rb_extend_object(sPasswd, rb_mEnumerable);
|
1169
1201
|
rb_define_singleton_method(sPasswd, "each", etc_each_passwd, 0);
|
1170
|
-
|
1202
|
+
#ifdef HAVE_GETPWENT
|
1203
|
+
rb_native_mutex_initialize(&passwd_blocking);
|
1204
|
+
#endif
|
1171
1205
|
#ifdef HAVE_GETGRENT
|
1206
|
+
rb_native_mutex_initialize(&group_blocking);
|
1172
1207
|
sGroup = rb_struct_define_under(mEtc, "Group", "name",
|
1173
1208
|
#ifdef HAVE_STRUCT_GROUP_GR_PASSWD
|
1174
1209
|
"passwd",
|
@@ -1200,6 +1235,7 @@ Init_etc(void)
|
|
1200
1235
|
rb_define_const(mEtc, "Group", sGroup);
|
1201
1236
|
#endif
|
1202
1237
|
rb_define_const(rb_cStruct, "Group", sGroup); /* deprecated name */
|
1238
|
+
rb_deprecate_constant(rb_cStruct, "Group");
|
1203
1239
|
rb_extend_object(sGroup, rb_mEnumerable);
|
1204
1240
|
rb_define_singleton_method(sGroup, "each", etc_each_group, 0);
|
1205
1241
|
#endif
|
data/ext/etc/extconf.rb
CHANGED
@@ -47,6 +47,11 @@ if !File.exist?("#{srcdir}/depend")
|
|
47
47
|
%x[#{RbConfig.ruby} #{srcdir}/mkconstants.rb -o #{srcdir}/constdefs.h]
|
48
48
|
end
|
49
49
|
|
50
|
+
decl = [
|
51
|
+
"void rb_deprecate_constant(VALUE, const char *);",
|
52
|
+
]
|
53
|
+
have_func('rb_deprecate_constant(Qnil, "None")', [decl])
|
54
|
+
|
50
55
|
$distcleanfiles << "constdefs.h"
|
51
56
|
|
52
57
|
create_makefile("etc")
|
data/test/etc/test_etc.rb
CHANGED
@@ -44,7 +44,7 @@ class TestEtc < Test::Unit::TestCase
|
|
44
44
|
unless s.empty?
|
45
45
|
assert_include(s, Etc.getpwuid)
|
46
46
|
end
|
47
|
-
end
|
47
|
+
end unless RUBY_PLATFORM.include?("android")
|
48
48
|
|
49
49
|
def test_getpwnam
|
50
50
|
passwd = {}
|
@@ -54,7 +54,7 @@ class TestEtc < Test::Unit::TestCase
|
|
54
54
|
passwd.each_value do |s|
|
55
55
|
assert_equal(s, Etc.getpwnam(s.name))
|
56
56
|
end
|
57
|
-
end
|
57
|
+
end unless RUBY_PLATFORM.include?("android")
|
58
58
|
|
59
59
|
def test_passwd_with_low_level_api
|
60
60
|
a = []
|
@@ -169,4 +169,27 @@ class TestEtc < Test::Unit::TestCase
|
|
169
169
|
assert_operator(1, :<=, n)
|
170
170
|
end
|
171
171
|
|
172
|
+
def test_ractor
|
173
|
+
return unless Etc.passwd # => skip test if no platform support
|
174
|
+
|
175
|
+
assert_ractor(<<~RUBY, require: 'etc')
|
176
|
+
ractor = Ractor.new do
|
177
|
+
Etc.passwd do |s|
|
178
|
+
Ractor.yield :sync
|
179
|
+
Ractor.yield s.name
|
180
|
+
break :done
|
181
|
+
end
|
182
|
+
end
|
183
|
+
ractor.take # => :sync
|
184
|
+
assert_raise RuntimeError, /parallel/ do
|
185
|
+
Etc.passwd {}
|
186
|
+
end
|
187
|
+
name = ractor.take # => first name
|
188
|
+
ractor.take # => :done
|
189
|
+
name2 = Etc.passwd do |s|
|
190
|
+
break s.name
|
191
|
+
end
|
192
|
+
assert_equal(name2, name)
|
193
|
+
RUBY
|
194
|
+
end
|
172
195
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: etc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yukihiro Matsumoto
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,13 +80,13 @@ files:
|
|
80
80
|
- ext/etc/etc.c
|
81
81
|
- ext/etc/extconf.rb
|
82
82
|
- ext/etc/mkconstants.rb
|
83
|
-
- stub/etc.rb
|
84
83
|
- test/etc/test_etc.rb
|
85
84
|
homepage: https://github.com/ruby/etc
|
86
85
|
licenses:
|
86
|
+
- Ruby
|
87
87
|
- BSD-2-Clause
|
88
88
|
metadata: {}
|
89
|
-
post_install_message:
|
89
|
+
post_install_message:
|
90
90
|
rdoc_options: []
|
91
91
|
require_paths:
|
92
92
|
- lib
|
@@ -101,8 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
|
-
rubygems_version: 3.
|
105
|
-
signing_key:
|
104
|
+
rubygems_version: 3.2.2
|
105
|
+
signing_key:
|
106
106
|
specification_version: 4
|
107
107
|
summary: Provides access to information typically stored in UNIX /etc directory.
|
108
108
|
test_files: []
|
data/stub/etc.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require "#{RUBY_VERSION[/\d+\.\d+/]}/etc.so"
|