etc 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 215e8d5d0a7f804a20a00ffd2879002451731866c6b7858d2f57ea24c2d885d9
4
- data.tar.gz: 3480e3113f594bd6e268bd014f243e26365f38a1660a2fc7916ead6a77de36be
3
+ metadata.gz: 5f5196e40206894d4fc74d486106863f351e131e89fa6017807542361a09c617
4
+ data.tar.gz: 131ade148fb05d021a9956ee282722012abbc0607f87bfa15bd06a0374264a4a
5
5
  SHA512:
6
- metadata.gz: ffc70bc1b076f3a0a5607f9f6684c977d55f1536e8f497ce4cfa62e2bff87eabce93679733cc3b27b99fef357e1a004dbeff0d2e68ce772337a4f23b8583a619
7
- data.tar.gz: 748e259456471c7a82728529999c01e31b75d311e1510306d9e097fb127e195a975cb7d6e0a6e16f5e4a7dc98157aeced29a9882f348aae731f920d8b749e2d2
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).
@@ -52,10 +52,34 @@ char *getenv();
52
52
  #endif
53
53
  char *getlogin();
54
54
 
55
- #define RUBY_ETC_VERSION "1.1.0"
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
- INT2NUM(pwd->pw_change),
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
- INT2NUM(pwd->pw_expire),
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 int passwd_blocking = 0;
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 = (int)Qfalse;
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 int group_blocking = 0;
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 = (int)Qfalse;
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
@@ -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")
@@ -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.1.0
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: 2019-11-30 00:00:00.000000000 Z
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.0.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: []
@@ -1 +0,0 @@
1
- require "#{RUBY_VERSION[/\d+\.\d+/]}/etc.so"