sctp-socket 0.1.2 → 0.1.4
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/.github/workflows/ruby.yml +22 -0
- data/CHANGES.md +11 -0
- data/README.md +1 -1
- data/Rakefile +15 -7
- data/examples/client_example.rb +1 -1
- data/examples/server_example.rb +1 -0
- data/ext/sctp/socket.c +201 -11
- data/sctp-socket.gemspec +1 -1
- data.tar.gz.sig +0 -0
- metadata +5 -5
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a53fb8e5953dbf9ca5c45e273ab45d4982ade9ec4b77e44657cd826757fb8ef
|
4
|
+
data.tar.gz: 8d3aa7a1087c0f348cf25d8dde354fcb5bfba61b7a9c6db78cf60922496bf983
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8e23832cbb9cc0b8741ef696ed97aa494c17a12cc22bbf2b6eeaaab401cd654efb9b9966913557d2d442ae694e698c081c147d6b448d88876efecc831254c0d7
|
7
|
+
data.tar.gz: 17617bb21948741bc3397c9528bf283c5a07ec6bc06b57f7db17b925236025738cbe72390d7cb9ceb791d4b992ecba438d0a5ef3752baffc1d3b676fff5c719c
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/.github/workflows/ruby.yml
CHANGED
@@ -35,3 +35,25 @@ jobs:
|
|
35
35
|
bundler-cache: true
|
36
36
|
- name: Run Specs
|
37
37
|
run: bundle exec rake
|
38
|
+
freebsd:
|
39
|
+
runs-on: ubuntu-latest
|
40
|
+
steps:
|
41
|
+
- uses: actions/checkout@v4
|
42
|
+
- name: Test in FreeBSD
|
43
|
+
id: test
|
44
|
+
uses: vmactions/freebsd-vm@v1
|
45
|
+
with:
|
46
|
+
usesh: true
|
47
|
+
prepare: |
|
48
|
+
pkg install -y llvm ruby devel/ruby-gems sctplib git-tiny
|
49
|
+
|
50
|
+
run: |
|
51
|
+
git config --global --add safe.directory /home/runner/work/sctp-socket/sctp-socket
|
52
|
+
kldload sctp
|
53
|
+
ifconfig lo1 create
|
54
|
+
ifconfig lo1 1.1.1.1/24 up
|
55
|
+
ifconfig lo2 create
|
56
|
+
ifconfig lo2 1.1.1.2/24 up
|
57
|
+
gem install bundler --no-document
|
58
|
+
bundle install --quiet
|
59
|
+
bundle exec rake
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## 0.1.4 - 1-Feb-2025
|
2
|
+
* Added the set_retransmission_info method.
|
3
|
+
* Added the get_rto_info and set_rto_info aliases.
|
4
|
+
* Added the set_association_info method.
|
5
|
+
* Some spec updates and refactoring.
|
6
|
+
|
7
|
+
## 0.1.3 - 22-Jan-2025
|
8
|
+
* The close method now accepts an optional `linger` argument.
|
9
|
+
* The bindx method now accepts an optional `reuse_addr` argument.
|
10
|
+
* Fixed a bug in the bindx method for address arrays with a single element.
|
11
|
+
|
1
12
|
## 0.1.2 - 10-Jan-2025
|
2
13
|
* Added support for BSD.
|
3
14
|
|
data/README.md
CHANGED
@@ -67,7 +67,7 @@ Currently this has only been developed and tested on Linux and BSD. Other
|
|
67
67
|
platforms will probably only be supported via community contributions.
|
68
68
|
|
69
69
|
The sendv and recvv methods may not be available. Use the sendmsg and recvmsg
|
70
|
-
methods instead.
|
70
|
+
methods instead if that's the case.
|
71
71
|
|
72
72
|
I am currently unable to subclass the Socket class from Ruby's standard library.
|
73
73
|
For whatever reason the call to rb_call_super works, but the fileno is always
|
data/Rakefile
CHANGED
@@ -39,13 +39,21 @@ end
|
|
39
39
|
|
40
40
|
desc "Create dummy IP addresses to use for testing"
|
41
41
|
task :create_dummy_links do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
42
|
+
if RbConfig::CONFIG['host_os'] =~ /linux/i
|
43
|
+
system('sudo ip link add dummy1 type dummy')
|
44
|
+
system('sudo ip link add dummy2 type dummy')
|
45
|
+
system('sudo ip addr add 1.1.1.1/24 dev dummy1')
|
46
|
+
system('sudo ip addr add 1.1.1.2/24 dev dummy2')
|
47
|
+
system('sudo ip link set dummy1 up')
|
48
|
+
system('sudo ip link set dummy2 up')
|
49
|
+
system('ip link show')
|
50
|
+
else
|
51
|
+
system("sudo ifconfig lo1 create")
|
52
|
+
system("sudo ifconfig lo1 1.1.1.1/24 up")
|
53
|
+
system("sudo ifconfig lo2 create")
|
54
|
+
system("sudo ifconfig lo2 1.1.1.2/24 up")
|
55
|
+
system("sudo ifconfig -a")
|
56
|
+
end
|
49
57
|
end
|
50
58
|
|
51
59
|
RSpec::Core::RakeTask.new
|
data/examples/client_example.rb
CHANGED
@@ -10,7 +10,7 @@ begin
|
|
10
10
|
socket = SCTP::Socket.new
|
11
11
|
|
12
12
|
# Optional, but could bind to a subset of available addresses
|
13
|
-
p socket.bindx(:addresses => addresses)
|
13
|
+
# p socket.bindx(:addresses => addresses)
|
14
14
|
|
15
15
|
# Initial connection
|
16
16
|
p socket.connectx(:addresses => addresses, :port => port)
|
data/examples/server_example.rb
CHANGED
data/ext/sctp/socket.c
CHANGED
@@ -335,11 +335,28 @@ static VALUE rsctp_init(int argc, VALUE* argv, VALUE self){
|
|
335
335
|
*
|
336
336
|
* Bind a subset of IP addresses associated with the host system on the
|
337
337
|
* given port, or a port assigned by the operating system if none is provided.
|
338
|
+
* You may bind a maximum of eight IP addresses.
|
338
339
|
*
|
339
340
|
* Note that you can both add or remove an address to or from the socket
|
340
341
|
* using the SCTP_BINDX_ADD_ADDR (default) or SCTP_BINDX_REM_ADDR constants,
|
341
342
|
* respectively.
|
342
343
|
*
|
344
|
+
* Possible options:
|
345
|
+
*
|
346
|
+
* * addresses - Array of IP addresses to bind to. If none are specified then
|
347
|
+
* INADDR_ANY is used.
|
348
|
+
*
|
349
|
+
* * port - The port to bind to. If none is specified then 0 is used, i.e. the
|
350
|
+
* OS will select one for you.
|
351
|
+
*
|
352
|
+
* * flags - Flags to pass to the underlying sctp_bindx function. In practice
|
353
|
+
* there are only two options: BINDX_ADD_ADDR and BINDX_REM_ADDR. By
|
354
|
+
* default a flag of BINDX_ADD_ADDR is assumed.
|
355
|
+
*
|
356
|
+
* * reuse_addr - If set to true, then the SO_REUSEADDR flag will be applied to
|
357
|
+
* the socket before the bind call. This will allow other sockets to reuse
|
358
|
+
* the addresses that are currently bound to the socket.
|
359
|
+
*
|
343
360
|
* Example:
|
344
361
|
*
|
345
362
|
* socket = SCTP::Socket.new
|
@@ -357,8 +374,8 @@ static VALUE rsctp_init(int argc, VALUE* argv, VALUE self){
|
|
357
374
|
*/
|
358
375
|
static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
359
376
|
struct sockaddr_in addrs[8];
|
360
|
-
int i, fileno, num_ip, flags, domain, port;
|
361
|
-
VALUE v_addresses, v_port, v_flags, v_address, v_options;
|
377
|
+
int i, fileno, num_ip, flags, domain, port, on;
|
378
|
+
VALUE v_addresses, v_port, v_flags, v_address, v_reuse_addr, v_options;
|
362
379
|
|
363
380
|
rb_scan_args(argc, argv, "01", &v_options);
|
364
381
|
|
@@ -370,6 +387,7 @@ static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
|
370
387
|
v_addresses = rb_hash_aref2(v_options, "addresses");
|
371
388
|
v_flags = rb_hash_aref2(v_options, "flags");
|
372
389
|
v_port = rb_hash_aref2(v_options, "port");
|
390
|
+
v_reuse_addr = rb_hash_aref2(v_options, "reuse_addr");
|
373
391
|
|
374
392
|
if(NIL_P(v_port))
|
375
393
|
port = 0;
|
@@ -386,10 +404,13 @@ static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
|
386
404
|
else
|
387
405
|
num_ip = (int)RARRAY_LEN(v_addresses);
|
388
406
|
|
407
|
+
if(num_ip > 8)
|
408
|
+
rb_raise(rb_eArgError, "too many IP addresses to bind, maximum is eight");
|
409
|
+
|
389
410
|
domain = NUM2INT(rb_iv_get(self, "@domain"));
|
390
411
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
391
412
|
|
392
|
-
if(
|
413
|
+
if(!NIL_P(v_addresses)){
|
393
414
|
for(i = 0; i < num_ip; i++){
|
394
415
|
v_address = RARRAY_PTR(v_addresses)[i];
|
395
416
|
addrs[i].sin_family = domain;
|
@@ -409,6 +430,12 @@ static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
|
409
430
|
#endif
|
410
431
|
}
|
411
432
|
|
433
|
+
if(v_reuse_addr == Qtrue){
|
434
|
+
on = 1;
|
435
|
+
if(setsockopt(fileno, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
|
436
|
+
rb_raise(rb_eSystemCallError, "setsockopt: %s", strerror(errno));
|
437
|
+
}
|
438
|
+
|
412
439
|
if(sctp_bindx(fileno, (struct sockaddr *) addrs, num_ip, flags) != 0)
|
413
440
|
rb_raise(rb_eSystemCallError, "sctp_bindx: %s", strerror(errno));
|
414
441
|
|
@@ -497,15 +524,46 @@ static VALUE rsctp_connectx(int argc, VALUE* argv, VALUE self){
|
|
497
524
|
*
|
498
525
|
* Close the socket. You should always do this.
|
499
526
|
*
|
527
|
+
* By default the underlying close operation is non-blocking. This means that the
|
528
|
+
* bound IP addresses may not be available right away after closing. You may
|
529
|
+
* optionally control this behavior with the +linger+ option.
|
530
|
+
*
|
531
|
+
*
|
532
|
+
* * linger - If present, this should be set to a numeric value, in seconds.
|
533
|
+
* The value will cause the close operation to block for that number of
|
534
|
+
* seconds, after which it will return (i.e. return to non-blocking).
|
535
|
+
*
|
500
536
|
* Example:
|
501
537
|
*
|
502
538
|
* socket = SCTP::Socket.new
|
503
|
-
* socket.close
|
539
|
+
* socket.close # or
|
540
|
+
* socket.close(linger: 5)
|
504
541
|
*/
|
505
|
-
static VALUE rsctp_close(VALUE self){
|
506
|
-
VALUE
|
542
|
+
static VALUE rsctp_close(int argc, VALUE* argv, VALUE self){
|
543
|
+
VALUE v_options, v_linger;
|
544
|
+
int fileno;
|
507
545
|
|
508
|
-
|
546
|
+
rb_scan_args(argc, argv, "01", &v_options);
|
547
|
+
|
548
|
+
if(NIL_P(v_options))
|
549
|
+
v_options = rb_hash_new();
|
550
|
+
|
551
|
+
Check_Type(v_options, T_HASH);
|
552
|
+
|
553
|
+
v_linger = rb_hash_aref2(v_options, "linger");
|
554
|
+
|
555
|
+
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
556
|
+
|
557
|
+
if(!NIL_P(v_linger)){
|
558
|
+
struct linger lin;
|
559
|
+
lin.l_onoff = 1;
|
560
|
+
lin.l_linger = NUM2INT(v_linger);
|
561
|
+
|
562
|
+
if(setsockopt(fileno, SOL_SOCKET, SO_LINGER, &lin, sizeof(struct linger)) < 0)
|
563
|
+
rb_raise(rb_eSystemCallError, "setsockopt: %s", strerror(errno));
|
564
|
+
}
|
565
|
+
|
566
|
+
if(close(fileno))
|
509
567
|
rb_raise(rb_eSystemCallError, "close: %s", strerror(errno));
|
510
568
|
|
511
569
|
return self;
|
@@ -695,6 +753,7 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
695
753
|
rb_raise(rb_eArgError, "Array size is greater than IOV_MAX");
|
696
754
|
|
697
755
|
// TODO: Make this configurable
|
756
|
+
spa.sendv_flags = SCTP_SEND_SNDINFO_VALID;
|
698
757
|
spa.sendv_sndinfo.snd_flags = SCTP_UNORDERED;
|
699
758
|
spa.sendv_sndinfo.snd_assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
|
700
759
|
|
@@ -1469,6 +1528,75 @@ static VALUE rsctp_get_association_info(VALUE self){
|
|
1469
1528
|
);
|
1470
1529
|
}
|
1471
1530
|
|
1531
|
+
/*
|
1532
|
+
* call-seq:
|
1533
|
+
* SCTP::Socket#set_association_info(options)
|
1534
|
+
*
|
1535
|
+
* Sets the association specific parameters. The +options+ parameter
|
1536
|
+
* is a hash that accepts the following keywords:
|
1537
|
+
*
|
1538
|
+
* * association_id
|
1539
|
+
* * max_retransmission_count
|
1540
|
+
* * number_peer_destinations
|
1541
|
+
* * peer_receive_window
|
1542
|
+
* * local_receive_window
|
1543
|
+
* * cookie_life
|
1544
|
+
*
|
1545
|
+
* All values that refer to time values are measured in milliseconds.
|
1546
|
+
*/
|
1547
|
+
static VALUE rsctp_set_association_info(VALUE self, VALUE v_options){
|
1548
|
+
VALUE v_assoc_id, v_max_rxt, v_nbr_peer, v_peer_rw, v_local_rw, v_cookie;
|
1549
|
+
int fileno;
|
1550
|
+
sctp_assoc_t assoc_id;
|
1551
|
+
struct sctp_assocparams assoc;
|
1552
|
+
|
1553
|
+
bzero(&assoc, sizeof(assoc));
|
1554
|
+
|
1555
|
+
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
1556
|
+
|
1557
|
+
v_assoc_id = rb_hash_aref2(v_options, "association_id");
|
1558
|
+
v_max_rxt = rb_hash_aref2(v_options, "max_retransmission_count");
|
1559
|
+
v_nbr_peer = rb_hash_aref2(v_options, "number_peer_destinations");
|
1560
|
+
v_peer_rw = rb_hash_aref2(v_options, "peer_receive_window");
|
1561
|
+
v_local_rw = rb_hash_aref2(v_options, "local_receive_window");
|
1562
|
+
v_cookie = rb_hash_aref2(v_options, "cookie_life");
|
1563
|
+
|
1564
|
+
if(NIL_P(v_assoc_id))
|
1565
|
+
assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
|
1566
|
+
else
|
1567
|
+
assoc_id = NUM2INT(v_assoc_id);
|
1568
|
+
|
1569
|
+
assoc.sasoc_assoc_id = assoc_id;
|
1570
|
+
|
1571
|
+
if(!NIL_P(v_max_rxt))
|
1572
|
+
assoc.sasoc_asocmaxrxt = NUM2INT(v_max_rxt);
|
1573
|
+
|
1574
|
+
if(!NIL_P(v_nbr_peer))
|
1575
|
+
assoc.sasoc_number_peer_destinations = NUM2INT(v_nbr_peer);
|
1576
|
+
|
1577
|
+
if(!NIL_P(v_peer_rw))
|
1578
|
+
assoc.sasoc_peer_rwnd = NUM2INT(v_peer_rw);
|
1579
|
+
|
1580
|
+
if(!NIL_P(v_local_rw))
|
1581
|
+
assoc.sasoc_local_rwnd = NUM2INT(v_local_rw);
|
1582
|
+
|
1583
|
+
if(!NIL_P(v_cookie))
|
1584
|
+
assoc.sasoc_cookie_life = NUM2INT(v_cookie);
|
1585
|
+
|
1586
|
+
if(setsockopt(fileno, IPPROTO_SCTP, SCTP_ASSOCINFO, &assoc, sizeof(assoc)) < 0)
|
1587
|
+
rb_raise(rb_eSystemCallError, "setsockopt: %s", strerror(errno));
|
1588
|
+
|
1589
|
+
return rb_struct_new(
|
1590
|
+
v_sctp_associnfo_struct,
|
1591
|
+
INT2NUM(assoc.sasoc_assoc_id),
|
1592
|
+
INT2NUM(assoc.sasoc_asocmaxrxt),
|
1593
|
+
INT2NUM(assoc.sasoc_number_peer_destinations),
|
1594
|
+
INT2NUM(assoc.sasoc_peer_rwnd),
|
1595
|
+
INT2NUM(assoc.sasoc_local_rwnd),
|
1596
|
+
INT2NUM(assoc.sasoc_cookie_life)
|
1597
|
+
);
|
1598
|
+
}
|
1599
|
+
|
1472
1600
|
/*
|
1473
1601
|
* call-seq:
|
1474
1602
|
* SCTP::Socket#shutdown
|
@@ -1543,6 +1671,64 @@ static VALUE rsctp_get_retransmission_info(VALUE self){
|
|
1543
1671
|
);
|
1544
1672
|
}
|
1545
1673
|
|
1674
|
+
/*
|
1675
|
+
* call-seq:
|
1676
|
+
* SCTP::Socket#set_retransmission_info(options)
|
1677
|
+
*
|
1678
|
+
* Sets the protocol parameters that are used to initialize and bind the
|
1679
|
+
* retransmission timeout (RTO) tunable. The method accepts a hash with
|
1680
|
+
* the following possible keys:
|
1681
|
+
*
|
1682
|
+
* * association_id
|
1683
|
+
* * initial
|
1684
|
+
* * max
|
1685
|
+
* * min
|
1686
|
+
*
|
1687
|
+
* The +initial+, +max+ and +min+ options default to zero (unchanged).
|
1688
|
+
*/
|
1689
|
+
static VALUE rsctp_set_retransmission_info(VALUE self, VALUE v_options){
|
1690
|
+
VALUE v_assoc_id, v_initial, v_max, v_min;
|
1691
|
+
int fileno;
|
1692
|
+
sctp_assoc_t assoc_id;
|
1693
|
+
struct sctp_rtoinfo rto;
|
1694
|
+
|
1695
|
+
bzero(&rto, sizeof(rto));
|
1696
|
+
|
1697
|
+
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
1698
|
+
|
1699
|
+
v_assoc_id = rb_hash_aref2(v_options, "association_id");
|
1700
|
+
v_initial = rb_hash_aref2(v_options, "initial");
|
1701
|
+
v_max = rb_hash_aref2(v_options, "max");
|
1702
|
+
v_min = rb_hash_aref2(v_options, "min");
|
1703
|
+
|
1704
|
+
if(NIL_P(v_assoc_id))
|
1705
|
+
v_assoc_id = rb_iv_get(self, "@association_id");
|
1706
|
+
|
1707
|
+
assoc_id = NUM2INT(v_assoc_id);
|
1708
|
+
|
1709
|
+
rto.srto_assoc_id = assoc_id;
|
1710
|
+
|
1711
|
+
if(!NIL_P(v_initial))
|
1712
|
+
rto.srto_initial = NUM2INT(v_initial);
|
1713
|
+
|
1714
|
+
if(!NIL_P(v_max))
|
1715
|
+
rto.srto_max = NUM2INT(v_max);
|
1716
|
+
|
1717
|
+
if(!NIL_P(v_min))
|
1718
|
+
rto.srto_min = NUM2INT(v_min);
|
1719
|
+
|
1720
|
+
if(setsockopt(fileno, IPPROTO_SCTP, SCTP_RTOINFO, &rto, sizeof(rto)) < 0)
|
1721
|
+
rb_raise(rb_eSystemCallError, "setsockopt: %s", strerror(errno));
|
1722
|
+
|
1723
|
+
return rb_struct_new(
|
1724
|
+
v_sctp_rtoinfo_struct,
|
1725
|
+
v_assoc_id,
|
1726
|
+
v_initial,
|
1727
|
+
v_max,
|
1728
|
+
v_min
|
1729
|
+
);
|
1730
|
+
}
|
1731
|
+
|
1546
1732
|
/*
|
1547
1733
|
* call-seq:
|
1548
1734
|
* SCTP::Socket#get_status
|
@@ -2298,7 +2484,7 @@ void Init_socket(void){
|
|
2298
2484
|
|
2299
2485
|
rb_define_method(cSocket, "autoclose=", rsctp_set_autoclose, 1);
|
2300
2486
|
rb_define_method(cSocket, "bindx", rsctp_bindx, -1);
|
2301
|
-
rb_define_method(cSocket, "close", rsctp_close,
|
2487
|
+
rb_define_method(cSocket, "close", rsctp_close, -1);
|
2302
2488
|
rb_define_method(cSocket, "connectx", rsctp_connectx, -1);
|
2303
2489
|
rb_define_method(cSocket, "delete_shared_key", rsctp_delete_shared_key, -1);
|
2304
2490
|
rb_define_method(cSocket, "disable_fragments=", rsctp_disable_fragments, 1);
|
@@ -2332,20 +2518,24 @@ void Init_socket(void){
|
|
2332
2518
|
|
2333
2519
|
rb_define_method(cSocket, "sendmsg", rsctp_sendmsg, 1);
|
2334
2520
|
rb_define_method(cSocket, "set_active_shared_key", rsctp_set_active_shared_key, -1);
|
2521
|
+
rb_define_method(cSocket, "set_association_info", rsctp_set_association_info, 1);
|
2335
2522
|
rb_define_method(cSocket, "set_initmsg", rsctp_set_initmsg, 1);
|
2336
|
-
|
2523
|
+
rb_define_method(cSocket, "set_retransmission_info", rsctp_set_retransmission_info, 1);
|
2337
2524
|
rb_define_method(cSocket, "set_shared_key", rsctp_set_shared_key, -1);
|
2338
2525
|
rb_define_method(cSocket, "shutdown", rsctp_shutdown, -1);
|
2339
2526
|
rb_define_method(cSocket, "subscribe", rsctp_subscribe, 1);
|
2340
2527
|
|
2528
|
+
rb_define_alias(cSocket, "get_rto_info", "get_retransmission_info");
|
2529
|
+
rb_define_alias(cSocket, "set_rto_info", "set_retransmission_info");
|
2530
|
+
|
2341
2531
|
rb_define_attr(cSocket, "domain", 1, 1);
|
2342
2532
|
rb_define_attr(cSocket, "type", 1, 1);
|
2343
2533
|
rb_define_attr(cSocket, "fileno", 1, 1);
|
2344
2534
|
rb_define_attr(cSocket, "association_id", 1, 1);
|
2345
2535
|
rb_define_attr(cSocket, "port", 1, 1);
|
2346
2536
|
|
2347
|
-
/* 0.1.
|
2348
|
-
rb_define_const(cSocket, "VERSION", rb_str_new2("0.1.
|
2537
|
+
/* 0.1.4: The version of this library */
|
2538
|
+
rb_define_const(cSocket, "VERSION", rb_str_new2("0.1.4"));
|
2349
2539
|
|
2350
2540
|
/* send flags */
|
2351
2541
|
|
data/sctp-socket.gemspec
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sctp-socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Berger
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain:
|
11
11
|
- |
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
36
36
|
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2025-01
|
38
|
+
date: 2025-02-01 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: bundler
|
@@ -133,7 +133,7 @@ metadata:
|
|
133
133
|
wiki_uri: https://github.com/djberg96/sctp-socket/wiki
|
134
134
|
rubygems_mfa_required: 'true'
|
135
135
|
funding_uri: https://github.com/sponsors/djberg96
|
136
|
-
post_install_message:
|
136
|
+
post_install_message:
|
137
137
|
rdoc_options: []
|
138
138
|
require_paths:
|
139
139
|
- lib
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
version: '0'
|
150
150
|
requirements: []
|
151
151
|
rubygems_version: 3.5.22
|
152
|
-
signing_key:
|
152
|
+
signing_key:
|
153
153
|
specification_version: 4
|
154
154
|
summary: Ruby bindings for SCTP sockets
|
155
155
|
test_files: []
|
metadata.gz.sig
CHANGED
Binary file
|