capng_c 0.1.1 → 0.1.2

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: 31b53b59b57445d79f742beb25910e6bb62270673d6c171ffea029938d5f35ee
4
- data.tar.gz: 62c157b61e3cc5e1bfd144effb8370a3de756e63a7cfccfb3012d236ceecd2d9
3
+ metadata.gz: 255863aedacdc832b5ff8da87fb0d97a2916a65b1385c6f8072281967039d632
4
+ data.tar.gz: e145914ff785ff35cf7df36e86e9fca56a6de5228139b4e9ef586888be20bad3
5
5
  SHA512:
6
- metadata.gz: a3b0b2deda2fb0c46fcce53f54097659a4d7fddd34e1bc4ce01fd27dea02a220263cf668deb048542009dc92b885753938f753af37e7a87500b806111330e552
7
- data.tar.gz: b2968668551f8b397d7f5da73d38004215cef706e2d8e2ecf09453a6ca4ef14ed4b8e550296767a5f38dba9e87edcb669b4edaf2cf8433e3f92c7c9a27591c0a
6
+ metadata.gz: e401c25553011b8e922b1f7c80574fef9d9890464905b29513485c7a1627091fa26532d6f461d86aeb202e82b64eddca7f31edde1e48f07a00bf8cb3fe67ab01
7
+ data.tar.gz: 6d6f3fbf99fc67ea2ec32f5803a453782d2f10e6773d7db1905eba33d01c657cb7a3a238d7cc65f910f5ad361398964b44135f4bf79c256d0edb35222f2cdb8d
@@ -46,27 +46,100 @@ rb_capng_alloc(VALUE klass)
46
46
  }
47
47
 
48
48
  static VALUE
49
- rb_capng_initialize(VALUE self)
49
+ rb_capng_initialize(int argc, VALUE *argv, VALUE self)
50
50
  {
51
+ VALUE rb_target, rb_pid_or_file;
52
+ int result = 0;
53
+ char *target = NULL;
54
+ int pid = 0, fd = 0;
55
+ rb_io_t *fptr = NULL;
56
+
57
+ rb_scan_args(argc, argv, "02", &rb_target, &rb_pid_or_file);
58
+
59
+ if (NIL_P(rb_target)) {
60
+ return Qnil;
61
+ }
62
+
63
+ if (RB_TYPE_P(rb_target, T_SYMBOL)) {
64
+ target = RSTRING_PTR(rb_sym2str(rb_target));
65
+ } else if (RB_TYPE_P(rb_target, T_STRING)) {
66
+ target = StringValuePtr(rb_target);
67
+ } else {
68
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance for tagret argument");
69
+ }
70
+
71
+ if (strcmp(target, "current_process") == 0) {
72
+ result = capng_get_caps_process();
73
+ if (result != 0) {
74
+ rb_raise(rb_eRuntimeError, "Couldn't get current process' capability");
75
+ }
76
+ } else if (strcmp(target, "other_process") == 0) {
77
+ Check_Type(rb_pid_or_file, T_FIXNUM);
78
+
79
+ pid = NUM2INT(rb_pid_or_file);
80
+ capng_setpid(pid);
81
+ result = capng_get_caps_process();
82
+ if (result != 0) {
83
+ rb_raise(rb_eRuntimeError, "Couldn't get current process' capability");
84
+ }
85
+ } else if (strcmp(target, "file") == 0) {
86
+ Check_Type(rb_pid_or_file, T_FILE);
87
+
88
+ fptr = RFILE(rb_pid_or_file)->fptr;
89
+ fd = fptr->fd;
90
+ result = capng_get_caps_fd(fd);
91
+ if (result != 0) {
92
+ rb_raise(rb_eRuntimeError, "Couldn't get current file capability");
93
+ }
94
+ }
95
+
51
96
  return Qnil;
52
97
  }
53
98
 
54
99
  static VALUE
55
- rb_capng_clear(VALUE self, VALUE rb_action_set)
100
+ rb_capng_clear(VALUE self, VALUE rb_select_name_or_enum)
56
101
  {
57
- Check_Type(rb_action_set, T_FIXNUM);
102
+ capng_select_t select = 0;
58
103
 
59
- capng_clear(NUM2INT(rb_action_set));
104
+ switch (TYPE(rb_select_name_or_enum)) {
105
+ case T_SYMBOL:
106
+ select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
107
+ break;
108
+ case T_STRING:
109
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
110
+ break;
111
+ case T_FIXNUM:
112
+ select = NUM2INT(rb_select_name_or_enum);
113
+ break;
114
+ default:
115
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
116
+ }
117
+
118
+ capng_clear(select);
60
119
 
61
120
  return Qnil;
62
121
  }
63
122
 
64
123
  static VALUE
65
- rb_capng_fill(VALUE self, VALUE rb_action_set)
124
+ rb_capng_fill(VALUE self, VALUE rb_select_name_or_enum)
66
125
  {
67
- Check_Type(rb_action_set, T_FIXNUM);
126
+ capng_select_t select = 0;
127
+
128
+ switch (TYPE(rb_select_name_or_enum)) {
129
+ case T_SYMBOL:
130
+ select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
131
+ break;
132
+ case T_STRING:
133
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
134
+ break;
135
+ case T_FIXNUM:
136
+ select = NUM2INT(rb_select_name_or_enum);
137
+ break;
138
+ default:
139
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
140
+ }
68
141
 
69
- capng_fill(NUM2INT(rb_action_set));
142
+ capng_fill(select);
70
143
 
71
144
  return Qnil;
72
145
  }
@@ -94,13 +167,41 @@ rb_capng_get_caps_process(VALUE self)
94
167
  }
95
168
 
96
169
  static VALUE
97
- rb_capng_update(VALUE self, VALUE rb_action_set, VALUE rb_update_type, VALUE rb_capability_or_name)
170
+ rb_capng_update(VALUE self,
171
+ VALUE rb_action_name_or_action, VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
98
172
  {
99
173
  int result = 0;
100
174
  unsigned int capability = 0;
175
+ capng_type_t capability_type = 0;
176
+ capng_act_t action = 0;
101
177
 
102
- Check_Type(rb_action_set, T_FIXNUM);
103
- Check_Type(rb_update_type, T_FIXNUM);
178
+ switch (TYPE(rb_action_name_or_action)) {
179
+ case T_SYMBOL:
180
+ action = action_name_to_action_type(RSTRING_PTR(rb_sym2str(rb_action_name_or_action)));
181
+ break;
182
+ case T_STRING:
183
+ action = action_name_to_action_type(StringValuePtr(rb_action_name_or_action));
184
+ break;
185
+ case T_FIXNUM:
186
+ action = NUM2INT(rb_action_name_or_action);
187
+ break;
188
+ default:
189
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
190
+ }
191
+
192
+ switch (TYPE(rb_capability_name_or_type)) {
193
+ case T_SYMBOL:
194
+ capability_type = capability_type_name_to_capability_type(RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
195
+ break;
196
+ case T_STRING:
197
+ capability_type = capability_type_name_to_capability_type(StringValuePtr(rb_capability_name_or_type));
198
+ break;
199
+ case T_FIXNUM:
200
+ capability_type = NUM2INT(rb_capability_name_or_type);
201
+ break;
202
+ default:
203
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
204
+ }
104
205
 
105
206
  switch (TYPE(rb_capability_or_name)) {
106
207
  case T_SYMBOL:
@@ -116,7 +217,7 @@ rb_capng_update(VALUE self, VALUE rb_action_set, VALUE rb_update_type, VALUE rb_
116
217
  rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability constant");
117
218
  }
118
219
 
119
- result = capng_update(NUM2UINT(rb_action_set), NUM2INT(rb_update_type), capability);
220
+ result = capng_update(action, capability_type, capability);
120
221
 
121
222
  if (result == 0)
122
223
  return Qtrue;
@@ -166,20 +267,49 @@ rb_capng_change_id(VALUE self, VALUE rb_uid, VALUE rb_gid, VALUE rb_flags)
166
267
  }
167
268
 
168
269
  static VALUE
169
- rb_capng_have_capabilities_p(VALUE self, VALUE rb_select_enum)
270
+ rb_capng_have_capabilities_p(VALUE self, VALUE rb_select_name_or_enum)
170
271
  {
171
272
  int result = 0;
273
+ capng_select_t select = 0;
172
274
 
173
- result = capng_have_capabilities(NUM2INT(rb_select_enum));
275
+ switch (TYPE(rb_select_name_or_enum)) {
276
+ case T_SYMBOL:
277
+ select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
278
+ break;
279
+ case T_STRING:
280
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
281
+ break;
282
+ case T_FIXNUM:
283
+ select = NUM2INT(rb_select_name_or_enum);
284
+ break;
285
+ default:
286
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
287
+ }
288
+ result = capng_have_capabilities(select);
174
289
 
175
290
  return INT2NUM(result);
176
291
  }
177
292
 
178
293
  static VALUE
179
- rb_capng_have_capability_p(VALUE self, VALUE rb_update_type, VALUE rb_capability_or_name)
294
+ rb_capng_have_capability_p(VALUE self, VALUE rb_capability_name_or_type, VALUE rb_capability_or_name)
180
295
  {
181
296
  int result = 0;
182
297
  unsigned int capability = 0;
298
+ capng_type_t capability_type = 0;
299
+
300
+ switch (TYPE(rb_capability_name_or_type)) {
301
+ case T_SYMBOL:
302
+ capability_type = capability_type_name_to_capability_type(RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
303
+ break;
304
+ case T_STRING:
305
+ capability_type = capability_type_name_to_capability_type(StringValuePtr(rb_capability_name_or_type));
306
+ break;
307
+ case T_FIXNUM:
308
+ capability_type = NUM2INT(rb_capability_name_or_type);
309
+ break;
310
+ default:
311
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
312
+ }
183
313
 
184
314
  switch (TYPE(rb_capability_or_name)) {
185
315
  case T_SYMBOL:
@@ -195,7 +325,7 @@ rb_capng_have_capability_p(VALUE self, VALUE rb_update_type, VALUE rb_capability
195
325
  rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability constant");
196
326
  }
197
327
 
198
- result = capng_have_capability(NUM2INT(rb_update_type), capability);
328
+ result = capng_have_capability(capability_type, capability);
199
329
 
200
330
  if (result == 1)
201
331
  return Qtrue;
@@ -254,7 +384,7 @@ Init_capng(void)
254
384
 
255
385
  rb_define_alloc_func(rb_cCapNG, rb_capng_alloc);
256
386
 
257
- rb_define_method(rb_cCapNG, "initialize", rb_capng_initialize, 0);
387
+ rb_define_method(rb_cCapNG, "initialize", rb_capng_initialize, -1);
258
388
  rb_define_method(rb_cCapNG, "clear", rb_capng_clear, 1);
259
389
  rb_define_method(rb_cCapNG, "fill", rb_capng_fill, 1);
260
390
  rb_define_method(rb_cCapNG, "setpid", rb_capng_setpid, 1);
@@ -20,6 +20,9 @@
20
20
 
21
21
  #include <cap-ng.h>
22
22
  #include <stdio.h>
23
+ #include <sys/types.h>
24
+ #include <sys/stat.h>
25
+ #include <fcntl.h>
23
26
 
24
27
  VALUE rb_cCapNG;
25
28
  VALUE rb_cCapNGPrint;
@@ -32,6 +35,11 @@ VALUE rb_mResult;
32
35
  VALUE rb_mPrint;
33
36
  VALUE rb_mFlags;
34
37
 
38
+ capng_select_t select_name_to_select_type(char *select_name);
39
+ capng_act_t action_name_to_action_type(char *action_name);
40
+ capng_print_t print_name_to_print_type(char *print_name);
41
+ capng_type_t capability_type_name_to_capability_type(char *capability_name);
42
+
35
43
  void Init_capng_capability(VALUE);
36
44
  void Init_capng_enum(VALUE);
37
45
  void Init_capng_print(VALUE);
@@ -52,16 +52,46 @@ rb_capng_print_initialize(VALUE self)
52
52
  }
53
53
 
54
54
  static VALUE
55
- rb_capng_print_caps_text(VALUE self, VALUE rb_where, VALUE rb_select_set)
55
+ rb_capng_print_caps_text(VALUE self, VALUE rb_where_name_or_type, VALUE rb_capability_name_or_type)
56
56
  {
57
57
  char *result = NULL;
58
+ capng_type_t capability_type = 0;
59
+ capng_print_t print_type = 0;
58
60
 
59
- switch (NUM2LONG(rb_where)) {
61
+ switch (TYPE(rb_capability_name_or_type)) {
62
+ case T_SYMBOL:
63
+ capability_type = capability_type_name_to_capability_type(RSTRING_PTR(rb_sym2str(rb_capability_name_or_type)));
64
+ break;
65
+ case T_STRING:
66
+ capability_type = capability_type_name_to_capability_type(StringValuePtr(rb_capability_name_or_type));
67
+ break;
68
+ case T_FIXNUM:
69
+ capability_type = NUM2INT(rb_capability_name_or_type);
70
+ break;
71
+ default:
72
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
73
+ }
74
+
75
+ switch (TYPE(rb_where_name_or_type)) {
76
+ case T_SYMBOL:
77
+ print_type = print_name_to_print_type(RSTRING_PTR(rb_sym2str(rb_where_name_or_type)));
78
+ break;
79
+ case T_STRING:
80
+ print_type = print_name_to_print_type(StringValuePtr(rb_where_name_or_type));
81
+ break;
82
+ case T_FIXNUM:
83
+ print_type = NUM2INT(rb_where_name_or_type);
84
+ break;
85
+ default:
86
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a print type constant");
87
+ }
88
+
89
+ switch (print_type) {
60
90
  case CAPNG_PRINT_STDOUT:
61
- capng_print_caps_text(CAPNG_PRINT_STDOUT, NUM2LONG(rb_select_set));
91
+ capng_print_caps_text(CAPNG_PRINT_STDOUT, capability_type);
62
92
  break;
63
93
  case CAPNG_PRINT_BUFFER:
64
- result = capng_print_caps_text(CAPNG_PRINT_BUFFER, NUM2INT(rb_select_set));
94
+ result = capng_print_caps_text(CAPNG_PRINT_BUFFER, capability_type);
65
95
  }
66
96
 
67
97
  if (result)
@@ -71,16 +101,46 @@ rb_capng_print_caps_text(VALUE self, VALUE rb_where, VALUE rb_select_set)
71
101
  }
72
102
 
73
103
  static VALUE
74
- rb_capng_print_caps_numeric(VALUE self, VALUE rb_where, VALUE rb_select_set)
104
+ rb_capng_print_caps_numeric(VALUE self, VALUE rb_where_name_or_type, VALUE rb_select_name_or_enum)
75
105
  {
76
106
  char *result = NULL;
107
+ capng_select_t select = 0;
108
+ capng_print_t print_type = 0;
109
+
110
+ switch (TYPE(rb_where_name_or_type)) {
111
+ case T_SYMBOL:
112
+ print_type = print_name_to_print_type(RSTRING_PTR(rb_sym2str(rb_where_name_or_type)));
113
+ break;
114
+ case T_STRING:
115
+ print_type = print_name_to_print_type(StringValuePtr(rb_where_name_or_type));
116
+ break;
117
+ case T_FIXNUM:
118
+ print_type = NUM2INT(rb_where_name_or_type);
119
+ break;
120
+ default:
121
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a print type constant");
122
+ }
123
+
124
+ switch (TYPE(rb_select_name_or_enum)) {
125
+ case T_SYMBOL:
126
+ select = select_name_to_select_type(RSTRING_PTR(rb_sym2str(rb_select_name_or_enum)));
127
+ break;
128
+ case T_STRING:
129
+ select = select_name_to_select_type(StringValuePtr(rb_select_name_or_enum));
130
+ break;
131
+ case T_FIXNUM:
132
+ select = NUM2INT(rb_select_name_or_enum);
133
+ break;
134
+ default:
135
+ rb_raise(rb_eArgError, "Expected a String or a Symbol instance, or a capability type constant");
136
+ }
77
137
 
78
- switch (NUM2LONG(rb_where)) {
138
+ switch (print_type) {
79
139
  case CAPNG_PRINT_STDOUT:
80
- capng_print_caps_numeric(CAPNG_PRINT_STDOUT, NUM2INT(rb_select_set));
140
+ capng_print_caps_numeric(CAPNG_PRINT_STDOUT, select);
81
141
  break;
82
142
  case CAPNG_PRINT_BUFFER:
83
- result = capng_print_caps_numeric(CAPNG_PRINT_BUFFER, NUM2LONG(rb_select_set));
143
+ result = capng_print_caps_numeric(CAPNG_PRINT_BUFFER, select);
84
144
  }
85
145
 
86
146
  if (result)
@@ -0,0 +1,80 @@
1
+ /* capng_c */
2
+ /* Copyright 2020- Hiroshi Hatake*/
3
+ /* */
4
+ /* Licensed under the Apache License, Version 2.0 (the "License"); */
5
+ /* you may not use this file except in compliance with the License. */
6
+ /* You may obtain a copy of the License at */
7
+ /* http://www.apache.org/licenses/LICENSE-2.0 */
8
+ /* Unless required by applicable law or agreed to in writing, software */
9
+ /* distributed under the License is distributed on an "AS IS" BASIS, */
10
+ /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
11
+ /* See the License for the specific language governing permissions and */
12
+ /* limitations under the License. */
13
+
14
+ #include <capng.h>
15
+
16
+ capng_select_t
17
+ select_name_to_select_type(char *select_name)
18
+ {
19
+ if (strcmp(select_name, "caps") == 0) {
20
+ return CAPNG_SELECT_CAPS;
21
+ } else if (strcmp(select_name, "bounds") == 0) {
22
+ return CAPNG_SELECT_BOUNDS;
23
+ } else if (strcmp(select_name, "both") == 0) {
24
+ return CAPNG_SELECT_BOTH;
25
+ #if defined(CAPNG_SELECT_AMBIENT)
26
+ } else if (strcmp(select_name, "ambient") == 0) {
27
+ return CAPNG_SELECT_AMBIENT;
28
+ #endif
29
+ #if defined(CAPNG_SELECT_ALL)
30
+ } else if (strcmp(select_name, "all") == 0) {
31
+ return CAPNG_SELECT_ALL;
32
+ #endif
33
+ } else {
34
+ rb_raise(rb_eArgError, "unknown select name %s", select_name);
35
+ }
36
+ }
37
+
38
+ capng_act_t
39
+ action_name_to_action_type(char *action_name)
40
+ {
41
+ if (strcmp(action_name, "drop") == 0) {
42
+ return CAPNG_DROP;
43
+ } else if (strcmp(action_name, "add") == 0) {
44
+ return CAPNG_ADD;
45
+ } else {
46
+ rb_raise(rb_eArgError, "unknown action name %s", action_name);
47
+ }
48
+ }
49
+
50
+ capng_print_t
51
+ print_name_to_print_type(char *print_name)
52
+ {
53
+ if (strcmp(print_name, "stdout") == 0) {
54
+ return CAPNG_PRINT_STDOUT;
55
+ } else if (strcmp(print_name, "buffer") == 0) {
56
+ return CAPNG_PRINT_BUFFER;
57
+ } else {
58
+ rb_raise(rb_eArgError, "unknown print name %s", print_name);
59
+ }
60
+ }
61
+
62
+ capng_type_t
63
+ capability_type_name_to_capability_type(char *capability_name)
64
+ {
65
+ if (strcmp(capability_name, "effective") == 0) {
66
+ return CAPNG_EFFECTIVE;
67
+ } else if (strcmp(capability_name, "permitted") == 0) {
68
+ return CAPNG_PERMITTED;
69
+ } else if (strcmp(capability_name, "inheritable") == 0) {
70
+ return CAPNG_INHERITABLE;
71
+ } else if (strcmp(capability_name, "bounding_set") == 0) {
72
+ return CAPNG_BOUNDING_SET;
73
+ #if defined(CAPNG_AMBIENT)
74
+ } else if (strcmp(capability_name, "ambient") == 0) {
75
+ return CAPNG_AMBIENT;
76
+ #endif
77
+ } else {
78
+ rb_raise(rb_eArgError, "unknown capability name: %s", capability_name);
79
+ }
80
+ }
@@ -7,6 +7,21 @@ class CapNG
7
7
  alias_method :caps_file_raw, :caps_file
8
8
  alias_method :apply_caps_file_raw, :apply_caps_file
9
9
  alias_method :update_raw, :update
10
+ alias_method :initialize_raw, :initialize
11
+
12
+ def initialize(target = nil, pid_or_path = nil)
13
+ if target.nil?
14
+ initialize_raw
15
+ elsif target && pid_or_path.is_a?(Integer)
16
+ initialize_raw(target, pid_or_path)
17
+ elsif target && pid_or_path.is_a?(String) && File.exist?(pid_or_path)
18
+ File.open(pid_or_path) do
19
+ initialize_raw(target, pid_or_path);
20
+ end
21
+ else
22
+ initialize_raw
23
+ end
24
+ end
10
25
 
11
26
  def caps_file(file_or_string_path)
12
27
  if file_or_string_path.is_a?(String) && File.exist?(file_or_string_path)
@@ -34,9 +49,13 @@ class CapNG
34
49
 
35
50
  def update(action, type, capability_or_capability_array)
36
51
  if capability_or_capability_array.is_a?(Array) && !capability_or_capability_array.empty?
52
+ results = []
37
53
  capability_or_capability_array.each do |capability|
38
- update_raw(action, type, capability)
54
+ result = update_raw(action, type, capability)
55
+ results << result
56
+ return results if !result
39
57
  end
58
+ results
40
59
  else
41
60
  update_raw(action, type, capability_or_capability_array)
42
61
  end
@@ -1,3 +1,3 @@
1
1
  class CapNG
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capng_c
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hiroshi Hatake
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-27 00:00:00.000000000 Z
11
+ date: 2020-10-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -96,6 +96,7 @@ files:
96
96
  - ext/capng/extconf.rb
97
97
  - ext/capng/print.c
98
98
  - ext/capng/state.c
99
+ - ext/capng/utils.c
99
100
  - lib/capng.rb
100
101
  - lib/capng/version.rb
101
102
  homepage: https://github.com/cosmo0920/cap-ng_c
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  - !ruby/object:Gem::Version
120
121
  version: '0'
121
122
  requirements: []
122
- rubygems_version: 3.0.3
123
+ rubygems_version: 3.1.4
123
124
  signing_key:
124
125
  specification_version: 4
125
126
  summary: libcap-ng bindings for Ruby.