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 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"