sctp-socket 0.0.5 → 0.0.6

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