sctp-socket 0.0.5 → 0.0.6

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: 319cf8cad773727889aed0c51508d4febfa4e145f9572ef2cdc265bdfc4c6ef2
4
- data.tar.gz: aa085297b675c4f8a1468d689868a25ff6e9b9f5c954324801146b3878bdb150
3
+ metadata.gz: 6a4c2e587ffc98a2c81d1d2a267fa4936539dc2456a9106a0146f31275e6db21
4
+ data.tar.gz: e5aa191fd3beb57240128ef58ef82df8f3b6beba3c25a5b357bc9b5effc7c238
5
5
  SHA512:
6
- metadata.gz: a26f8069a0034447ceadd4bb5e59af079da161e4ed0d2620de9df1809e072284fa2fc7aea0799f8f1d17f2da74de744ebc4fec399f21f93e0afa713092b5e0ca
7
- data.tar.gz: 5267896027a79534c91c52396528654a9f046437ccf437be392d1609fbee72980cfd18116db8e85453048976a990084321089d6159822a5453d4ba155163581f
6
+ metadata.gz: d023d5c17b03912812d02c8cb58279b5c874c45c481bdc1cd685dd89e8f2d62565512675d2cdc89f5e6b8107dce42634a3a1b4a063df8a6b32fed6762029adb4
7
+ data.tar.gz: 900e6fb83030d63453d99f9046942b2e6dfaee4340615d668669a922abc5628f58056aa464c9f36fe974ac0cccec4f3699fee7211778b6e49f49d856d7ea002d
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,4 @@
1
+ # These are supported funding model platforms
2
+
3
+ github: djberg96
4
+ open_collective: daniel-berger
data/CHANGES.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 0.0.6 - 24-May-2024
2
+ * Fixup the sendv method and add some documentation.
3
+ * Added documentation to the get_status method.
4
+ * Update the example server and client code, including comments for how to
5
+ setup multiple dummy IP addresses locally for testing.
6
+ * Some warning cleanup and build improvements.
7
+ * Added SCTP_BINDX constants.
8
+ * Started adding some real specs.
9
+
1
10
  ## 0.0.5 - 15-Dec-2021
2
11
  * Add handling for Linux platforms that don't support the sctp_sendv function
3
12
  and/or the SCTP_SEND_FAILED_EVENT notification.
data/README.md CHANGED
@@ -2,18 +2,20 @@
2
2
 
3
3
  A Ruby interface for SCTP sockets.
4
4
 
5
- WARNING: THIS IS CURRENTLY AN ALPHA PRODUCT. NOT RECOMMENDED FOR PRODUCTION USE AT THIS TIME.
6
-
7
5
  ## Prerequisites
8
6
 
9
7
  You will need the sctp development headers installed.
10
8
 
11
- On some systems, such as RHEL8, you may need to enable the sctp module.
9
+ On some systems, such as RHEL8 or later, you may need to enable the sctp module.
12
10
 
13
11
  ## Installation
14
12
 
15
13
  `gem install sctp-socket`
16
14
 
15
+ ## Installing the Trusted Cert
16
+
17
+ `gem cert --add <(curl -Ls https://raw.githubusercontent.com/djberg96/sctp-socket/main/certs/djberg96_pub.pem)`
18
+
17
19
  ## About SCTP
18
20
 
19
21
  The Stream Control Transmission Protocol (SCTP) is a message oriented, reliable
@@ -62,8 +64,7 @@ end
62
64
  Currently this has only been developed and tested on Linux. Other platforms
63
65
  will probably only be supported via community contributions.
64
66
 
65
- On Ubuntu 20 and possibly other Linux variants, the sendv method is not
66
- available. Use the sendmsg method instead.
67
+ The sendv method is not available on some Linux variants. Use the sendmsg method instead.
67
68
 
68
69
  Please report any issues on the github project page.
69
70
 
@@ -81,7 +82,7 @@ Apache-2.0
81
82
 
82
83
  ## Copyright
83
84
 
84
- (C) 2020, Daniel J. Berger
85
+ (C) 2020-2024, Daniel J. Berger
85
86
  Al Rights Reserved
86
87
 
87
88
  ## Author
@@ -1,11 +1,40 @@
1
1
  require 'socket'
2
2
  require 'sctp/socket'
3
3
 
4
+ # Adjust as needed. Server server_example.rb for creating
5
+ # fake network interfaces for testing.
6
+ addresses = ['1.1.1.1', '1.1.1.2']
7
+
4
8
  begin
5
9
  port = 62324
6
10
  socket = SCTP::Socket.new
7
- bytes_sent = socket.sendmsg(:message => "Hello World!", :addresses => ['127.0.0.1'], :port => port, :stream => 2)
8
- p bytes_sent
11
+
12
+ # Optional, but could bind to a subset of available addresses
13
+ p socket.bind(:addresses => addresses)
14
+
15
+ # Initial connection
16
+ p socket.connect(:addresses => addresses, :port => port)
17
+
18
+ # Try a sendv
19
+ p socket.sendv(:message => ["Hello ", "World!"])
20
+
21
+ # Send messages on separate streams of the same connection
22
+ arr = []
23
+
24
+ 0.upto(4) do |n|
25
+ arr << Thread.new do |t|
26
+ puts "Stream: #{n}"
27
+ bytes_sent = socket.sendmsg(
28
+ :message => "Hello World: #{n+1}",
29
+ :addresses => addresses.shuffle,
30
+ :stream => n,
31
+ :port => port
32
+ )
33
+ puts "Bytes Sent: #{bytes_sent}"
34
+ end
35
+ end
36
+
37
+ arr.map(&:join)
9
38
  ensure
10
39
  socket.close if socket
11
40
  end
@@ -1,11 +1,31 @@
1
1
  require 'sctp/socket'
2
2
 
3
+ # rake compile + ruby -Ilib to run local version
4
+ puts "VERSION: #{SCTP::Socket::VERSION}"
5
+
6
+ # To test multiple IP addresses locally:
7
+ #
8
+ # sudo apt install iproute2
9
+ # Add 'dummy' to /etc/modules
10
+ #
11
+ # sudo ip link add dummy1 type dummy
12
+ # sudo ip link add dummy2 type dummy
13
+ #
14
+ # sudo ip addr add 1.1.1.1/24 dev dummy1
15
+ # sudo ip addr add 1.1.1.2/24 dev dummy2
16
+ #
17
+ # sudo ip link set dummy1 up
18
+ # sudo ip link set dummy2 up
19
+
3
20
  # Adjust IP addresses as needed
21
+ addresses = ['1.1.1.1', '1.1.1.2']
22
+
4
23
  begin
5
24
  port = 62324
6
25
  socket = SCTP::Socket.new
7
- socket.bind(:port => port, :addresses => ['10.0.5.5', '10.0.6.5'])
26
+ socket.bind(:port => port, :addresses => addresses)
8
27
  socket.set_initmsg(:output_streams => 5, :input_streams => 5, :max_attempts => 4)
28
+ socket.subscribe(:data_io => true, :shutdown => true, :send_failure => true, :partial_delivery => true)
9
29
  socket.listen
10
30
 
11
31
  while true
data/ext/sctp/extconf.rb CHANGED
@@ -1,6 +1,29 @@
1
1
  require 'mkmf'
2
2
 
3
- have_header('netinet/sctp.h')
3
+ dir_config('sctp')
4
+
5
+ unless have_header('netinet/sctp.h')
6
+ os = IO.readlines('/etc/os-release').first.split('=').last
7
+ msg = "\nSCTP HEADERS NOT FOUND. PLEASE INSTALL THEM FIRST LIKE SO:\n\n"
8
+
9
+ if os =~ /red|fedora|centos/i
10
+ msg << "#####################################################################################\n"
11
+ msg << "# dnf install lksctp-tools #\n"
12
+ msg << "# dnf install kernel-modules-extra #\n"
13
+ msg << "# #\n"
14
+ msg << "# sed -e '/blacklist sctp/s/^b/#b/g' -i /etc/modprobe.d/sctp-blacklist.conf #\n"
15
+ msg << "# sed -e '/blacklist sctp/s/^b/#b/g' -i /etc/modprobe.d/sctp_diag-blacklist.conf #\n"
16
+ msg << "# #\n"
17
+ msg << "# sudo systemctl restart systemd-modules-load.service #\n"
18
+ msg << "#####################################################################################\n"
19
+ else
20
+ msg << "sudo apt-get install libsctp-dev lksctp-tools\n\n"
21
+ end
22
+
23
+ warn msg
24
+ exit
25
+ end
26
+
4
27
  have_library('sctp')
5
28
  have_func('sctp_sendv', 'netinet/sctp.h')
6
29
  have_struct_member('struct sctp_event_subscribe', 'sctp_send_failure_event', 'netinet/sctp.h')
data/ext/sctp/socket.c CHANGED
@@ -26,27 +26,10 @@ VALUE v_sctp_default_send_params_struct;
26
26
  #if defined(_SC_IOV_MAX)
27
27
  #define IOV_MAX (sysconf(_SC_IOV_MAX))
28
28
  #else
29
- // Assume infinity, or let the syscall return with error
30
29
  #define IOV_MAX INT_MAX
31
30
  #endif
32
31
  #endif
33
32
 
34
- #define ARY2IOVEC(iov,ary) \
35
- do { \
36
- VALUE *cur; \
37
- struct iovec *tmp; \
38
- long n; \
39
- cur = RARRAY_PTR(ary); \
40
- n = RARRAY_LEN(ary); \
41
- iov = tmp = alloca(sizeof(struct iovec) * n); \
42
- for (; --n >= 0; tmp++, cur++) { \
43
- if (TYPE(*cur) != T_STRING) \
44
- rb_raise(rb_eArgError, "must be an array of strings"); \
45
- tmp->iov_base = RSTRING_PTR(*cur); \
46
- tmp->iov_len = RSTRING_LEN(*cur); \
47
- } \
48
- } while (0)
49
-
50
33
  // TODO: Yes, I know I need to update the signature.
51
34
  VALUE convert_sockaddr_in_to_struct(struct sockaddr_in* addr){
52
35
  char ipbuf[INET6_ADDRSTRLEN];
@@ -202,6 +185,8 @@ static VALUE rsctp_bind(int argc, VALUE* argv, VALUE self){
202
185
  port = sin.sin_port;
203
186
  }
204
187
 
188
+ rb_iv_set(self, "@port", INT2NUM(port));
189
+
205
190
  return INT2NUM(port);
206
191
  }
207
192
 
@@ -350,19 +335,58 @@ static VALUE rsctp_getlocalnames(VALUE self){
350
335
  }
351
336
 
352
337
  #ifdef HAVE_SCTP_SENDV
353
- static VALUE rsctp_sendv(VALUE self, VALUE v_messages){
354
- struct iovec* iov;
355
- struct sockaddr* addrs[8];
338
+ /*
339
+ * Transmit a message to an SCTP endpoint using a gather-write. The following
340
+ * hash of options is permitted:
341
+ *
342
+ * * message - An array of strings that will be joined into a single message.
343
+ * * addresses - An array of IP addresses to setup an association to send the message.
344
+ * * info_type - The type of information provided. The default is SCTP_SENDV_SNDINFO.
345
+ *
346
+ * Example:
347
+ *
348
+ * socket = SCTP::Socket.new
349
+ *
350
+ * socket.sendv
351
+ * :message => ['Hello ', 'World.'],
352
+ * :addresses => ['10.0.5.4', '10.0.6.4'],
353
+ * :info_type => SCTP::Socket:::SCTP_SENDV_SNDINFO
354
+ * )
355
+ *
356
+ * CAVEAT: Currently addresses does not work, and info_type is not yet supported.
357
+ *
358
+ * Returns the number of bytes sent.
359
+ */
360
+ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
361
+ VALUE v_msg, v_message, v_addresses;
362
+ struct iovec iov[IOV_MAX];
363
+ struct sockaddr_in* addrs;
356
364
  struct sctp_sndinfo info;
357
- int sock_fd, num_bytes, size;
365
+ int i, sock_fd, num_bytes, size, num_ip;
358
366
 
359
- Check_Type(v_messages, T_ARRAY);
360
- bzero(&addrs, sizeof(addrs));
367
+ Check_Type(v_options, T_HASH);
361
368
 
362
- sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
369
+ bzero(&iov, sizeof(iov));
370
+ bzero(&info, sizeof(info));
371
+
372
+ v_message = rb_hash_aref2(v_options, "message");
373
+ v_addresses = rb_hash_aref2(v_options, "addresses");
374
+
375
+ if(!NIL_P(v_message))
376
+ Check_Type(v_message, T_ARRAY);
377
+
378
+ if(!NIL_P(v_addresses)){
379
+ Check_Type(v_addresses, T_ARRAY);
380
+ num_ip = RARRAY_LEN(v_addresses);
381
+ addrs = (struct sockaddr_in*)alloca(sizeof(struct sockaddr_in) * num_ip);
382
+ }
383
+ else{
384
+ addrs = NULL;
385
+ num_ip = 0;
386
+ }
363
387
 
364
- Check_Type(v_messages, T_ARRAY);
365
- size = RARRAY_LEN(v_messages);
388
+ sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
389
+ size = RARRAY_LEN(v_message);
366
390
 
367
391
  if(!size)
368
392
  rb_raise(rb_eArgError, "Must contain at least one message");
@@ -370,17 +394,41 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_messages){
370
394
  if(size > IOV_MAX)
371
395
  rb_raise(rb_eArgError, "Array size is greater than IOV_MAX");
372
396
 
373
- ARY2IOVEC(iov, v_messages);
374
-
375
397
  info.snd_flags = SCTP_UNORDERED;
376
398
  info.snd_assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
377
399
 
400
+ if(!NIL_P(v_addresses)){
401
+ int i, port;
402
+ VALUE v_address, v_port;
403
+
404
+ v_port = NUM2INT(rb_iv_get(self, "@port"));
405
+
406
+ if(NIL_P(v_port))
407
+ port = 0;
408
+ else
409
+ port = NUM2INT(v_port);
410
+
411
+ for(i = 0; i < num_ip; i++){
412
+ v_address = RARRAY_PTR(v_addresses)[i];
413
+ addrs->sin_family = NUM2INT(rb_iv_get(self, "@domain"));
414
+ addrs->sin_port = htons(port);
415
+ addrs->sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
416
+ addrs += sizeof(struct sockaddr_in);
417
+ }
418
+ }
419
+
420
+ for(i = 0; i < size; i++){
421
+ v_msg = RARRAY_PTR(v_message)[i];
422
+ iov[i].iov_base = StringValueCStr(v_msg);
423
+ iov[i].iov_len = RSTRING_LEN(v_msg);
424
+ }
425
+
378
426
  num_bytes = sctp_sendv(
379
427
  sock_fd,
380
428
  iov,
381
429
  size,
382
- NULL,
383
- 0,
430
+ (struct sockaddr*)addrs,
431
+ num_ip,
384
432
  &info,
385
433
  sizeof(info),
386
434
  SCTP_SENDV_SNDINFO,
@@ -491,14 +539,14 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
491
539
  * Transmit a message to an SCTP endpoint. The following hash of options
492
540
  * is permitted:
493
541
  *
494
- * :message -> The message to send to the endpoint. Mandatory.
495
- * :stream -> The SCTP stream number you wish to send the message on.
496
- * :to -> An array of addresses to send the message to.
497
- * :context -> The default context used for the sendmsg call if the send fails.
498
- * :ppid -> The payload protocol identifier that is passed to the peer endpoint.
499
- * :flags -> A bitwise integer that contain one or more values that control behavior.
542
+ * :message -> The message to send to the endpoint. Mandatory.
543
+ * :stream -> The SCTP stream number you wish to send the message on.
544
+ * :addresses -> An array of addresses to send the message to.
545
+ * :context -> The default context used for the sendmsg call if the send fails.
546
+ * :ppid -> The payload protocol identifier that is passed to the peer endpoint.
547
+ * :flags -> A bitwise integer that contain one or more values that control behavior.
500
548
  *
501
- * Note that the :to option is not mandatory in a one-to-one (SOCK_STREAM)
549
+ * Note that the :addresses option is not mandatory in a one-to-one (SOCK_STREAM)
502
550
  * socket connection. However, it must have been set previously via the
503
551
  * connect method.
504
552
  *
@@ -507,12 +555,14 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
507
555
  * socket = SCTP::Socket.new
508
556
  *
509
557
  * socket.sendmsg(
510
- * :message => "Hello World!",
511
- * :stream => 3,
512
- * :flags => SCTP::Socket::SCTP_UNORDERED | SCTP::Socket::SCTP_SENDALL,
513
- * :ttl => 100,
514
- * :to => ['10.0.5.4', '10.0.6.4']
558
+ * :message => "Hello World!",
559
+ * :stream => 3,
560
+ * :flags => SCTP::Socket::SCTP_UNORDERED | SCTP::Socket::SCTP_SENDALL,
561
+ * :ttl => 100,
562
+ * :addresses => ['10.0.5.4', '10.0.6.4']
515
563
  * )
564
+ *
565
+ * Returns the number of bytes sent.
516
566
  */
517
567
  static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
518
568
  VALUE v_msg, v_ppid, v_flags, v_stream, v_ttl, v_context, v_addresses;
@@ -644,7 +694,10 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
644
694
 
645
695
  sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
646
696
  length = sizeof(struct sockaddr_in);
697
+
647
698
  bzero(buffer, sizeof(buffer));
699
+ bzero(&clientaddr, sizeof(clientaddr));
700
+ bzero(&sndrcvinfo, sizeof(sndrcvinfo));
648
701
 
649
702
  bytes = sctp_recvmsg(
650
703
  sock_fd,
@@ -919,7 +972,7 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
919
972
  * - The peer has sent a shutdown to the local endpoint.
920
973
  *
921
974
  * :data_io
922
- * - Message data was received. On by default.
975
+ * - Message data was received. You will want to subscribe to this in most cases.
923
976
  *
924
977
  * Others:
925
978
  *
@@ -932,14 +985,12 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
932
985
  * :sender_dry
933
986
  * :peer_error
934
987
  *
935
- * By default only data_io is subscribed to.
936
- *
937
988
  * Example:
938
989
  *
939
990
  * socket = SCTP::Socket.new
940
991
  *
941
992
  * socket.bind(:port => port, :addresses => ['127.0.0.1'])
942
- * socket.subscribe(:shutdown => true, :send_failure => true)
993
+ * socket.subscribe(:data_io => true, :shutdown => true, :send_failure => true)
943
994
  */
944
995
  static VALUE rsctp_subscribe(VALUE self, VALUE v_options){
945
996
  int sock_fd;
@@ -1016,7 +1067,7 @@ static VALUE rsctp_listen(int argc, VALUE* argv, VALUE self){
1016
1067
  sock_fd = NUM2INT(rb_iv_get(self, "@sock_fd"));
1017
1068
 
1018
1069
  if(listen(sock_fd, backlog) < 0)
1019
- rb_raise(rb_eSystemCallError, "setsockopt: %s", strerror(errno));
1070
+ rb_raise(rb_eSystemCallError, "listen: %s", strerror(errno));
1020
1071
 
1021
1072
  return self;
1022
1073
  }
@@ -1143,6 +1194,27 @@ static VALUE rsctp_get_retransmission_info(VALUE self){
1143
1194
  );
1144
1195
  }
1145
1196
 
1197
+ /*
1198
+ * Get the status of a connected socket.
1199
+ *
1200
+ * Example:
1201
+ *
1202
+ * socket = SCTP::Socket.new
1203
+ * socket.connect(...)
1204
+ * socket.get_status
1205
+ *
1206
+ * Returns a Struct::Status object, which contains the following fields:
1207
+ *
1208
+ * * association_id
1209
+ * * state
1210
+ * * receive_window
1211
+ * * unacknowledged_data
1212
+ * * pending_data
1213
+ * * inbound_streams
1214
+ * * outbound_streams
1215
+ * * fragmentation_point
1216
+ * * primary (IP)
1217
+ */
1146
1218
  static VALUE rsctp_get_status(VALUE self){
1147
1219
  int sock_fd;
1148
1220
  socklen_t size;
@@ -1186,7 +1258,7 @@ static VALUE rsctp_get_status(VALUE self){
1186
1258
  );
1187
1259
  }
1188
1260
 
1189
- void Init_socket(){
1261
+ void Init_socket(void){
1190
1262
  mSCTP = rb_define_module("SCTP");
1191
1263
  cSocket = rb_define_class_under(mSCTP, "Socket", rb_cObject);
1192
1264
 
@@ -1289,8 +1361,8 @@ void Init_socket(){
1289
1361
  rb_define_attr(cSocket, "association_id", 1, 1);
1290
1362
  rb_define_attr(cSocket, "port", 1, 1);
1291
1363
 
1292
- /* 0.0.5: The version of this library */
1293
- rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.5"));
1364
+ /* 0.0.6: The version of this library */
1365
+ rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.6"));
1294
1366
 
1295
1367
  /* send flags */
1296
1368
 
@@ -1322,4 +1394,9 @@ void Init_socket(){
1322
1394
  rb_define_const(cSocket, "SCTP_SHUTDOWN_SENT", INT2NUM(SCTP_SHUTDOWN_SENT));
1323
1395
  rb_define_const(cSocket, "SCTP_SHUTDOWN_RECEIVED", INT2NUM(SCTP_SHUTDOWN_RECEIVED));
1324
1396
  rb_define_const(cSocket, "SCTP_SHUTDOWN_ACK_SENT", INT2NUM(SCTP_SHUTDOWN_ACK_SENT));
1397
+
1398
+ // BINDING //
1399
+
1400
+ rb_define_const(cSocket, "SCTP_BINDX_ADD_ADDR", INT2NUM(SCTP_BINDX_ADD_ADDR));
1401
+ rb_define_const(cSocket, "SCTP_BINDX_REM_ADDR", INT2NUM(SCTP_BINDX_REM_ADDR));
1325
1402
  }
data/sctp-socket.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'sctp-socket'
3
- spec.version = '0.0.5'
3
+ spec.version = '0.0.6'
4
4
  spec.author = 'Daniel Berger'
5
5
  spec.email = 'djberg96@gmail.com'
6
6
  spec.summary = 'Ruby bindings for SCTP sockets'
@@ -19,6 +19,16 @@ Gem::Specification.new do |spec|
19
19
  spec.add_development_dependency 'rake-compiler', '~> 1.1'
20
20
  spec.add_development_dependency 'rspec', '~> 3.9'
21
21
 
22
+ spec.metadata = {
23
+ 'homepage_uri' => 'https://github.com/djberg96/sctp-socket',
24
+ 'bug_tracker_uri' => 'https://github.com/djberg96/sctp-socket/issues',
25
+ 'changelog_uri' => 'https://github.com/djberg96/sctp-socket/blob/main/CHANGES.md',
26
+ 'documentation_uri' => 'https://github.com/djberg96/sctp-socket/wiki',
27
+ 'source_code_uri' => 'https://github.com/djberg96/sctp-socket',
28
+ 'wiki_uri' => 'https://github.com/djberg96/sctp-socket/wiki',
29
+ 'rubygems_mfa_required' => 'true'
30
+ }
31
+
22
32
  spec.description = <<-EOF
23
33
  The sctp-socket library provides Ruby bindings for SCTP sockets. is a
24
34
  message oriented, reliable transport protocol with direct support for
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sctp-socket
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Berger
@@ -35,7 +35,7 @@ cert_chain:
35
35
  ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
36
36
  WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
37
37
  -----END CERTIFICATE-----
38
- date: 2021-12-15 00:00:00.000000000 Z
38
+ date: 2024-05-25 00:00:00.000000000 Z
39
39
  dependencies:
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: bundler
@@ -103,6 +103,7 @@ extensions:
103
103
  - ext/sctp/extconf.rb
104
104
  extra_rdoc_files: []
105
105
  files:
106
+ - ".github/FUNDING.yml"
106
107
  - ".gitignore"
107
108
  - CHANGES.md
108
109
  - Gemfile
@@ -122,7 +123,14 @@ files:
122
123
  homepage: https://github.com/djberg96/sctp-socket
123
124
  licenses:
124
125
  - Apache-2.0
125
- metadata: {}
126
+ metadata:
127
+ homepage_uri: https://github.com/djberg96/sctp-socket
128
+ bug_tracker_uri: https://github.com/djberg96/sctp-socket/issues
129
+ changelog_uri: https://github.com/djberg96/sctp-socket/blob/main/CHANGES.md
130
+ documentation_uri: https://github.com/djberg96/sctp-socket/wiki
131
+ source_code_uri: https://github.com/djberg96/sctp-socket
132
+ wiki_uri: https://github.com/djberg96/sctp-socket/wiki
133
+ rubygems_mfa_required: 'true'
126
134
  post_install_message:
127
135
  rdoc_options: []
128
136
  require_paths:
@@ -138,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
146
  - !ruby/object:Gem::Version
139
147
  version: '0'
140
148
  requirements: []
141
- rubygems_version: 3.2.25
149
+ rubygems_version: 3.4.19
142
150
  signing_key:
143
151
  specification_version: 4
144
152
  summary: Ruby bindings for SCTP sockets
metadata.gz.sig CHANGED
Binary file