eventmachine 1.0.9.1 → 1.2.0.dev.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/cmain.cpp +77 -5
  4. data/ext/ed.cpp +100 -39
  5. data/ext/ed.h +27 -13
  6. data/ext/em.cpp +105 -163
  7. data/ext/em.h +10 -7
  8. data/ext/eventmachine.h +13 -1
  9. data/ext/extconf.rb +22 -13
  10. data/ext/fastfilereader/rubymain.cpp +6 -6
  11. data/ext/project.h +9 -4
  12. data/ext/rubymain.cpp +155 -36
  13. data/ext/ssl.cpp +157 -13
  14. data/ext/ssl.h +7 -2
  15. data/lib/em/channel.rb +5 -0
  16. data/lib/em/completion.rb +2 -2
  17. data/lib/em/connection.rb +61 -3
  18. data/lib/em/iterator.rb +26 -5
  19. data/lib/em/pool.rb +1 -1
  20. data/lib/em/protocols/line_and_text.rb +1 -1
  21. data/lib/em/pure_ruby.rb +6 -1
  22. data/lib/em/queue.rb +16 -7
  23. data/lib/em/resolver.rb +46 -23
  24. data/lib/em/threaded_resource.rb +2 -2
  25. data/lib/em/version.rb +1 -1
  26. data/lib/eventmachine.rb +59 -42
  27. data/rakelib/package.rake +23 -1
  28. data/tests/dhparam.pem +13 -0
  29. data/tests/em_test_helper.rb +79 -0
  30. data/tests/test_basic.rb +17 -26
  31. data/tests/test_channel.rb +14 -1
  32. data/tests/test_connection_write.rb +2 -2
  33. data/tests/test_defer.rb +17 -0
  34. data/tests/test_epoll.rb +1 -1
  35. data/tests/test_fork.rb +75 -0
  36. data/tests/test_ipv4.rb +125 -0
  37. data/tests/test_ipv6.rb +131 -0
  38. data/tests/test_iterator.rb +18 -0
  39. data/tests/test_many_fds.rb +1 -1
  40. data/tests/test_queue.rb +14 -0
  41. data/tests/test_resolver.rb +23 -0
  42. data/tests/test_set_sock_opt.rb +2 -0
  43. data/tests/test_ssl_dhparam.rb +83 -0
  44. data/tests/test_ssl_ecdh_curve.rb +79 -0
  45. data/tests/test_ssl_extensions.rb +49 -0
  46. data/tests/test_ssl_methods.rb +19 -0
  47. data/tests/test_ssl_protocols.rb +246 -0
  48. data/tests/test_ssl_verify.rb +44 -0
  49. data/tests/test_system.rb +4 -0
  50. data/tests/test_unbind_reason.rb +5 -1
  51. metadata +116 -49
  52. data/.gitignore +0 -21
  53. data/.travis.yml +0 -22
  54. data/.yardopts +0 -7
  55. data/Gemfile +0 -2
  56. data/Rakefile +0 -20
  57. data/eventmachine.gemspec +0 -38
  58. data/rakelib/cpp.rake_example +0 -77
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9accfa9d0a6fb933ee2745b4730d685199b25a3a
4
- data.tar.gz: de5e70e4c6422a5706a57887a497d2e3468a2b80
3
+ metadata.gz: a994ca9df20011c3235aa182177c104b2addf877
4
+ data.tar.gz: 4ed4c114fea5873f2df925b8f107be1e8dc9fc71
5
5
  SHA512:
6
- metadata.gz: 9d8982740ad9880c92fcdf48b0ce0ee2b592e336c56352a17fe3b7aa6cce938ef14d213c09d7b1d9d4a85605f314ab668d726a0f50d74e80d48eaa6d4e8f040a
7
- data.tar.gz: 67325efc4257b6b9eb1853ac562b147990b3c780d993e2b00b2163babb1bc923efa06976d209c80154f15100b2beee21b5bdbab3d623abfd18afd6de4788b1b1
6
+ metadata.gz: b563fae2d491799348769d7e8ce2f7a189600220ba60a0e4356fd1f2a73c97d24643724737cd1bb9e625e5db902233e5b1994c9c84750ec37742bffe142b15c2
7
+ data.tar.gz: 1d79e3826c263467b34bc5b448d5170c48ae06b3121eff3f90913ee9dd3606364ed10adbd2a3b5170f141272db681daf9d9000976f900c85ee9006e07834380c
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # About EventMachine [![Code Climate](https://codeclimate.com/github/eventmachine/eventmachine.png)](https://codeclimate.com/github/eventmachine/eventmachine)
1
+ # About EventMachine [![Code Climate](https://codeclimate.com/github/eventmachine/eventmachine.svg)](https://codeclimate.com/github/eventmachine/eventmachine)
2
2
 
3
3
 
4
4
  ## What is EventMachine ##
@@ -18,7 +18,7 @@ This unique combination makes EventMachine a premier choice for designers of cri
18
18
  applications, including Web servers and proxies, email and IM production systems, authentication/authorization
19
19
  processors, and many more.
20
20
 
21
- EventMachine has been around since the early 2000s and is a mature and battle tested library.
21
+ EventMachine has been around since the early 2000s and is a mature and battle-tested library.
22
22
 
23
23
 
24
24
  ## What EventMachine is good for? ##
@@ -433,6 +433,15 @@ extern "C" void evma_stop_machine()
433
433
  EventMachine->ScheduleHalt();
434
434
  }
435
435
 
436
+ /*****************
437
+ evma_stopping
438
+ *****************/
439
+
440
+ extern "C" bool evma_stopping()
441
+ {
442
+ ensure_eventmachine("evma_stopping");
443
+ return EventMachine->Stopping();
444
+ }
436
445
 
437
446
  /**************
438
447
  evma_start_tls
@@ -450,12 +459,12 @@ extern "C" void evma_start_tls (const uintptr_t binding)
450
459
  evma_set_tls_parms
451
460
  ******************/
452
461
 
453
- extern "C" void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer)
462
+ extern "C" void evma_set_tls_parms (const uintptr_t binding, const char *privatekey_filename, const char *certchain_filename, int verify_peer, int fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int ssl_version)
454
463
  {
455
464
  ensure_eventmachine("evma_set_tls_parms");
456
465
  EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
457
466
  if (ed)
458
- ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false));
467
+ ed->SetTlsParms (privatekey_filename, certchain_filename, (verify_peer == 1 ? true : false), (fail_if_no_peer_cert == 1 ? true : false), sni_hostname, cipherlist, ecdh_curve, dhparam, ssl_version);
459
468
  }
460
469
 
461
470
  /******************
@@ -473,6 +482,66 @@ extern "C" X509 *evma_get_peer_cert (const uintptr_t binding)
473
482
  }
474
483
  #endif
475
484
 
485
+ /******************
486
+ evma_get_cipher_bits
487
+ ******************/
488
+
489
+ #ifdef WITH_SSL
490
+ extern "C" int evma_get_cipher_bits (const uintptr_t binding)
491
+ {
492
+ ensure_eventmachine("evma_get_cipher_bits");
493
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
494
+ if (ed)
495
+ return ed->GetCipherBits();
496
+ return -1;
497
+ }
498
+ #endif
499
+
500
+ /******************
501
+ evma_get_cipher_name
502
+ ******************/
503
+
504
+ #ifdef WITH_SSL
505
+ extern "C" const char *evma_get_cipher_name (const uintptr_t binding)
506
+ {
507
+ ensure_eventmachine("evma_get_cipher_name");
508
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
509
+ if (ed)
510
+ return ed->GetCipherName();
511
+ return NULL;
512
+ }
513
+ #endif
514
+
515
+ /******************
516
+ evma_get_cipher_protocol
517
+ ******************/
518
+
519
+ #ifdef WITH_SSL
520
+ extern "C" const char *evma_get_cipher_protocol (const uintptr_t binding)
521
+ {
522
+ ensure_eventmachine("evma_get_cipher_protocol");
523
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
524
+ if (ed)
525
+ return ed->GetCipherProtocol();
526
+ return NULL;
527
+ }
528
+ #endif
529
+
530
+ /******************
531
+ evma_get_sni_hostname
532
+ ******************/
533
+
534
+ #ifdef WITH_SSL
535
+ extern "C" const char *evma_get_sni_hostname (const uintptr_t binding)
536
+ {
537
+ ensure_eventmachine("evma_get_sni_hostname");
538
+ EventableDescriptor *ed = dynamic_cast <EventableDescriptor*> (Bindable_t::GetObject (binding));
539
+ if (ed)
540
+ return ed->GetSNIHostname();
541
+ return NULL;
542
+ }
543
+ #endif
544
+
476
545
  /********************
477
546
  evma_accept_ssl_peer
478
547
  ********************/
@@ -521,10 +590,10 @@ extern "C" int evma_get_sockname (const uintptr_t binding, struct sockaddr *sa,
521
590
  evma_get_subprocess_pid
522
591
  ***********************/
523
592
 
593
+ #ifdef OS_UNIX
524
594
  extern "C" int evma_get_subprocess_pid (const uintptr_t binding, pid_t *pid)
525
595
  {
526
596
  ensure_eventmachine("evma_get_subprocess_pid");
527
- #ifdef OS_UNIX
528
597
  PipeDescriptor *pd = dynamic_cast <PipeDescriptor*> (Bindable_t::GetObject (binding));
529
598
  if (pd) {
530
599
  return pd->GetSubprocessPid (pid) ? 1 : 0;
@@ -535,10 +604,13 @@ extern "C" int evma_get_subprocess_pid (const uintptr_t binding, pid_t *pid)
535
604
  }
536
605
  else
537
606
  return 0;
538
- #else
607
+ }
608
+ #else
609
+ extern "C" int evma_get_subprocess_pid (const uintptr_t binding UNUSED, pid_t *pid UNUSED)
610
+ {
539
611
  return 0;
540
- #endif
541
612
  }
613
+ #endif
542
614
 
543
615
  /**************************
544
616
  evma_get_subprocess_status
data/ext/ed.cpp CHANGED
@@ -49,24 +49,26 @@ bool SetSocketNonblocking (SOCKET sd)
49
49
  SetFdCloexec
50
50
  ************/
51
51
 
52
+ #ifdef OS_UNIX
52
53
  bool SetFdCloexec (int fd)
53
54
  {
54
- #ifdef OS_UNIX
55
55
  int flags = fcntl(fd, F_GETFD, 0);
56
56
  assert (flags >= 0);
57
57
  flags |= FD_CLOEXEC;
58
58
  return (fcntl(fd, F_SETFD, FD_CLOEXEC) == 0) ? true : false;
59
- #else
60
- // TODO: Windows?
59
+ }
60
+ #else
61
+ bool SetFdCloexec (int fd UNUSED)
62
+ {
61
63
  return true;
62
- #endif
63
64
  }
65
+ #endif
64
66
 
65
67
  /****************************************
66
68
  EventableDescriptor::EventableDescriptor
67
69
  ****************************************/
68
70
 
69
- EventableDescriptor::EventableDescriptor (int sd, EventMachine_t *em):
71
+ EventableDescriptor::EventableDescriptor (SOCKET sd, EventMachine_t *em):
70
72
  bCloseNow (false),
71
73
  bCloseAfterWriting (false),
72
74
  MySocket (sd),
@@ -387,7 +389,7 @@ uint64_t EventableDescriptor::GetNextHeartbeat()
387
389
  ConnectionDescriptor::ConnectionDescriptor
388
390
  ******************************************/
389
391
 
390
- ConnectionDescriptor::ConnectionDescriptor (int sd, EventMachine_t *em):
392
+ ConnectionDescriptor::ConnectionDescriptor (SOCKET sd, EventMachine_t *em):
391
393
  EventableDescriptor (sd, em),
392
394
  bConnectPending (false),
393
395
  bNotifyReadable (false),
@@ -442,6 +444,9 @@ void ConnectionDescriptor::_UpdateEvents(bool read, bool write)
442
444
  if (MySocket == INVALID_SOCKET)
443
445
  return;
444
446
 
447
+ if (!read && !write)
448
+ return;
449
+
445
450
  #ifdef HAVE_EPOLL
446
451
  unsigned int old = EpollEvent.events;
447
452
 
@@ -768,7 +773,7 @@ void ConnectionDescriptor::Read()
768
773
  * come here more than once after being closed. (FCianfrocca)
769
774
  */
770
775
 
771
- int sd = GetSocket();
776
+ SOCKET sd = GetSocket();
772
777
  //assert (sd != INVALID_SOCKET); (original, removed 22Aug06)
773
778
  if (sd == INVALID_SOCKET) {
774
779
  assert (!bReadAttemptedAfterClose);
@@ -1010,7 +1015,7 @@ void ConnectionDescriptor::_WriteOutboundData()
1010
1015
  * doing it to address some reports of crashing under heavy loads.
1011
1016
  */
1012
1017
 
1013
- int sd = GetSocket();
1018
+ SOCKET sd = GetSocket();
1014
1019
  //assert (sd != INVALID_SOCKET);
1015
1020
  if (sd == INVALID_SOCKET) {
1016
1021
  assert (!bWriteAttemptedAfterClose);
@@ -1180,7 +1185,7 @@ void ConnectionDescriptor::StartTls()
1180
1185
  if (SslBox)
1181
1186
  throw std::runtime_error ("SSL/TLS already running on connection");
1182
1187
 
1183
- SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, GetBinding());
1188
+ SslBox = new SslBox_t (bIsServer, PrivateKeyFilename, CertChainFilename, bSslVerifyPeer, bSslFailIfNoPeerCert, SniHostName, CipherList, EcdhCurve, DhParam, Protocols, GetBinding());
1184
1189
  _DispatchCiphertext();
1185
1190
 
1186
1191
  }
@@ -1197,7 +1202,7 @@ ConnectionDescriptor::SetTlsParms
1197
1202
  *********************************/
1198
1203
 
1199
1204
  #ifdef WITH_SSL
1200
- void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer)
1205
+ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer, bool fail_if_no_peer_cert, const char *sni_hostname, const char *cipherlist, const char *ecdh_curve, const char *dhparam, int protocols)
1201
1206
  {
1202
1207
  if (SslBox)
1203
1208
  throw std::runtime_error ("call SetTlsParms before calling StartTls");
@@ -1205,10 +1210,22 @@ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename, const char
1205
1210
  PrivateKeyFilename = privkey_filename;
1206
1211
  if (certchain_filename && *certchain_filename)
1207
1212
  CertChainFilename = certchain_filename;
1208
- bSslVerifyPeer = verify_peer;
1213
+ bSslVerifyPeer = verify_peer;
1214
+ bSslFailIfNoPeerCert = fail_if_no_peer_cert;
1215
+
1216
+ if (sni_hostname && *sni_hostname)
1217
+ SniHostName = sni_hostname;
1218
+ if (cipherlist && *cipherlist)
1219
+ CipherList = cipherlist;
1220
+ if (ecdh_curve && *ecdh_curve)
1221
+ EcdhCurve = ecdh_curve;
1222
+ if (dhparam && *dhparam)
1223
+ DhParam = dhparam;
1224
+
1225
+ Protocols = protocols;
1209
1226
  }
1210
1227
  #else
1211
- void ConnectionDescriptor::SetTlsParms (const char *privkey_filename UNUSED, const char *certchain_filename UNUSED, bool verify_peer UNUSED)
1228
+ void ConnectionDescriptor::SetTlsParms (const char *privkey_filename UNUSED, const char *certchain_filename UNUSED, bool verify_peer UNUSED, bool fail_if_no_peer_cert UNUSED, const char *sni_hostname UNUSED, const char *cipherlist UNUSED, const char *ecdh_curve UNUSED, const char *dhparam UNUSED, int protocols UNUSED)
1212
1229
  {
1213
1230
  throw std::runtime_error ("Encryption not available on this event-machine");
1214
1231
  }
@@ -1229,6 +1246,62 @@ X509 *ConnectionDescriptor::GetPeerCert()
1229
1246
  #endif
1230
1247
 
1231
1248
 
1249
+ /*********************************
1250
+ ConnectionDescriptor::GetCipherBits
1251
+ *********************************/
1252
+
1253
+ #ifdef WITH_SSL
1254
+ int ConnectionDescriptor::GetCipherBits()
1255
+ {
1256
+ if (!SslBox)
1257
+ throw std::runtime_error ("SSL/TLS not running on this connection");
1258
+ return SslBox->GetCipherBits();
1259
+ }
1260
+ #endif
1261
+
1262
+
1263
+ /*********************************
1264
+ ConnectionDescriptor::GetCipherName
1265
+ *********************************/
1266
+
1267
+ #ifdef WITH_SSL
1268
+ const char *ConnectionDescriptor::GetCipherName()
1269
+ {
1270
+ if (!SslBox)
1271
+ throw std::runtime_error ("SSL/TLS not running on this connection");
1272
+ return SslBox->GetCipherName();
1273
+ }
1274
+ #endif
1275
+
1276
+
1277
+ /*********************************
1278
+ ConnectionDescriptor::GetCipherProtocol
1279
+ *********************************/
1280
+
1281
+ #ifdef WITH_SSL
1282
+ const char *ConnectionDescriptor::GetCipherProtocol()
1283
+ {
1284
+ if (!SslBox)
1285
+ throw std::runtime_error ("SSL/TLS not running on this connection");
1286
+ return SslBox->GetCipherProtocol();
1287
+ }
1288
+ #endif
1289
+
1290
+
1291
+ /*********************************
1292
+ ConnectionDescriptor::GetSNIHostname
1293
+ *********************************/
1294
+
1295
+ #ifdef WITH_SSL
1296
+ const char *ConnectionDescriptor::GetSNIHostname()
1297
+ {
1298
+ if (!SslBox)
1299
+ throw std::runtime_error ("SSL/TLS not running on this connection");
1300
+ return SslBox->GetSNIHostname();
1301
+ }
1302
+ #endif
1303
+
1304
+
1232
1305
  /***********************************
1233
1306
  ConnectionDescriptor::VerifySslPeer
1234
1307
  ***********************************/
@@ -1356,7 +1429,7 @@ void ConnectionDescriptor::Heartbeat()
1356
1429
  LoopbreakDescriptor::LoopbreakDescriptor
1357
1430
  ****************************************/
1358
1431
 
1359
- LoopbreakDescriptor::LoopbreakDescriptor (int sd, EventMachine_t *parent_em):
1432
+ LoopbreakDescriptor::LoopbreakDescriptor (SOCKET sd, EventMachine_t *parent_em):
1360
1433
  EventableDescriptor (sd, parent_em)
1361
1434
  {
1362
1435
  /* This is really bad and ugly. Change someday if possible.
@@ -1403,7 +1476,7 @@ void LoopbreakDescriptor::Write()
1403
1476
  AcceptorDescriptor::AcceptorDescriptor
1404
1477
  **************************************/
1405
1478
 
1406
- AcceptorDescriptor::AcceptorDescriptor (int sd, EventMachine_t *parent_em):
1479
+ AcceptorDescriptor::AcceptorDescriptor (SOCKET sd, EventMachine_t *parent_em):
1407
1480
  EventableDescriptor (sd, parent_em)
1408
1481
  {
1409
1482
  #ifdef HAVE_EPOLL
@@ -1463,15 +1536,15 @@ void AcceptorDescriptor::Read()
1463
1536
  int accept_count = EventMachine_t::GetSimultaneousAcceptCount();
1464
1537
 
1465
1538
  for (int i=0; i < accept_count; i++) {
1466
- #if defined(HAVE_SOCK_CLOEXEC) && defined(HAVE_ACCEPT4)
1467
- int sd = accept4 (GetSocket(), (struct sockaddr*)&pin, &addrlen, SOCK_CLOEXEC);
1539
+ #if defined(HAVE_CONST_SOCK_CLOEXEC) && defined(HAVE_ACCEPT4)
1540
+ SOCKET sd = accept4 (GetSocket(), (struct sockaddr*)&pin, &addrlen, SOCK_CLOEXEC);
1468
1541
  if (sd == INVALID_SOCKET) {
1469
1542
  // We may be running in a kernel where
1470
1543
  // SOCK_CLOEXEC is not supported - fall back:
1471
1544
  sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen);
1472
1545
  }
1473
1546
  #else
1474
- int sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen);
1547
+ SOCKET sd = accept (GetSocket(), (struct sockaddr*)&pin, &addrlen);
1475
1548
  #endif
1476
1549
  if (sd == INVALID_SOCKET) {
1477
1550
  // This breaks the loop when we've accepted everything on the kernel queue,
@@ -1567,7 +1640,7 @@ bool AcceptorDescriptor::GetSockname (struct sockaddr *s, socklen_t *len)
1567
1640
  DatagramDescriptor::DatagramDescriptor
1568
1641
  **************************************/
1569
1642
 
1570
- DatagramDescriptor::DatagramDescriptor (int sd, EventMachine_t *parent_em):
1643
+ DatagramDescriptor::DatagramDescriptor (SOCKET sd, EventMachine_t *parent_em):
1571
1644
  EventableDescriptor (sd, parent_em),
1572
1645
  OutboundDataSize (0)
1573
1646
  {
@@ -1635,7 +1708,7 @@ DatagramDescriptor::Read
1635
1708
 
1636
1709
  void DatagramDescriptor::Read()
1637
1710
  {
1638
- int sd = GetSocket();
1711
+ SOCKET sd = GetSocket();
1639
1712
  assert (sd != INVALID_SOCKET);
1640
1713
  LastActivity = MyEventMachine->GetCurrentLoopTime();
1641
1714
 
@@ -1712,7 +1785,7 @@ void DatagramDescriptor::Write()
1712
1785
  * TODO, we are currently suppressing the EMSGSIZE error!!!
1713
1786
  */
1714
1787
 
1715
- int sd = GetSocket();
1788
+ SOCKET sd = GetSocket();
1716
1789
  assert (sd != INVALID_SOCKET);
1717
1790
  LastActivity = MyEventMachine->GetCurrentLoopTime();
1718
1791
 
@@ -1725,7 +1798,8 @@ void DatagramDescriptor::Write()
1725
1798
  OutboundPage *op = &(OutboundPages[0]);
1726
1799
 
1727
1800
  // The nasty cast to (char*) is needed because Windows is brain-dead.
1728
- int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From), sizeof(op->From));
1801
+ int s = sendto (sd, (char*)op->Buffer, op->Length, 0, (struct sockaddr*)&(op->From),
1802
+ (op->From.sin6_family == AF_INET6 ? sizeof (struct sockaddr_in6) : sizeof (struct sockaddr_in)));
1729
1803
  #ifdef OS_WIN32
1730
1804
  int e = WSAGetLastError();
1731
1805
  #else
@@ -1837,23 +1911,10 @@ int DatagramDescriptor::SendOutboundDatagram (const char *data, unsigned long le
1837
1911
  if (!address || !*address || !port)
1838
1912
  return 0;
1839
1913
 
1840
- sockaddr_in pin;
1841
- unsigned long HostAddr;
1842
-
1843
- HostAddr = inet_addr (address);
1844
- if (HostAddr == INADDR_NONE) {
1845
- // The nasty cast to (char*) is because Windows is brain-dead.
1846
- hostent *hp = gethostbyname ((char*)address);
1847
- if (!hp)
1848
- return 0;
1849
- HostAddr = ((in_addr*)(hp->h_addr))->s_addr;
1850
- }
1851
-
1852
- memset (&pin, 0, sizeof(pin));
1853
- pin.sin_family = AF_INET;
1854
- pin.sin_addr.s_addr = HostAddr;
1855
- pin.sin_port = htons (port);
1856
-
1914
+ struct sockaddr_in6 addr_here;
1915
+ size_t addr_here_len = sizeof addr_here;
1916
+ if (!EventMachine_t::name2address (address, port, (struct sockaddr *)&addr_here, &addr_here_len))
1917
+ return -1;
1857
1918
 
1858
1919
  if (!data && (length > 0))
1859
1920
  throw std::runtime_error ("bad outbound data");
@@ -1862,7 +1923,7 @@ int DatagramDescriptor::SendOutboundDatagram (const char *data, unsigned long le
1862
1923
  throw std::runtime_error ("no allocation for outbound data");
1863
1924
  memcpy (buffer, data, length);
1864
1925
  buffer [length] = 0;
1865
- OutboundPages.push_back (OutboundPage (buffer, length, pin));
1926
+ OutboundPages.push_back (OutboundPage (buffer, length, addr_here));
1866
1927
  OutboundDataSize += length;
1867
1928
 
1868
1929
  #ifdef HAVE_EPOLL
data/ext/ed.h CHANGED
@@ -36,10 +36,10 @@ class EventableDescriptor
36
36
  class EventableDescriptor: public Bindable_t
37
37
  {
38
38
  public:
39
- EventableDescriptor (int, EventMachine_t*);
39
+ EventableDescriptor (SOCKET, EventMachine_t*);
40
40
  virtual ~EventableDescriptor();
41
41
 
42
- int GetSocket() {return MySocket;}
42
+ SOCKET GetSocket() {return MySocket;}
43
43
  void SetSocketInvalid() { MySocket = INVALID_SOCKET; }
44
44
  void Close();
45
45
 
@@ -69,10 +69,14 @@ class EventableDescriptor: public Bindable_t
69
69
  virtual bool GetSubprocessPid (pid_t*) {return false;}
70
70
 
71
71
  virtual void StartTls() {}
72
- virtual void SetTlsParms (const char *, const char *, bool) {}
72
+ virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int) {}
73
73
 
74
74
  #ifdef WITH_SSL
75
75
  virtual X509 *GetPeerCert() {return NULL;}
76
+ virtual int GetCipherBits() {return -1;}
77
+ virtual const char *GetCipherName() {return NULL;}
78
+ virtual const char *GetCipherProtocol() {return NULL;}
79
+ virtual const char *GetSNIHostname() {return NULL;}
76
80
  #endif
77
81
 
78
82
  virtual uint64_t GetCommInactivityTimeout() {return 0;}
@@ -108,7 +112,7 @@ class EventableDescriptor: public Bindable_t
108
112
  bool bCloseAfterWriting;
109
113
 
110
114
  protected:
111
- int MySocket;
115
+ SOCKET MySocket;
112
116
  bool bAttached;
113
117
  bool bWatchOnly;
114
118
 
@@ -151,7 +155,7 @@ class LoopbreakDescriptor
151
155
  class LoopbreakDescriptor: public EventableDescriptor
152
156
  {
153
157
  public:
154
- LoopbreakDescriptor (int, EventMachine_t*);
158
+ LoopbreakDescriptor (SOCKET, EventMachine_t*);
155
159
  virtual ~LoopbreakDescriptor() {}
156
160
 
157
161
  virtual void Read();
@@ -170,7 +174,7 @@ class ConnectionDescriptor
170
174
  class ConnectionDescriptor: public EventableDescriptor
171
175
  {
172
176
  public:
173
- ConnectionDescriptor (int, EventMachine_t*);
177
+ ConnectionDescriptor (SOCKET, EventMachine_t*);
174
178
  virtual ~ConnectionDescriptor();
175
179
 
176
180
  int SendOutboundData (const char*, unsigned long);
@@ -201,10 +205,14 @@ class ConnectionDescriptor: public EventableDescriptor
201
205
  virtual int GetOutboundDataSize() {return OutboundDataSize;}
202
206
 
203
207
  virtual void StartTls();
204
- virtual void SetTlsParms (const char *privkey_filename, const char *certchain_filename, bool verify_peer);
208
+ virtual void SetTlsParms (const char *, const char *, bool, bool, const char *, const char *, const char *, const char *, int);
205
209
 
206
210
  #ifdef WITH_SSL
207
211
  virtual X509 *GetPeerCert();
212
+ virtual int GetCipherBits();
213
+ virtual const char *GetCipherName();
214
+ virtual const char *GetCipherProtocol();
215
+ virtual const char *GetSNIHostname();
208
216
  virtual bool VerifySslPeer(const char*);
209
217
  virtual void AcceptSslPeer();
210
218
  #endif
@@ -245,8 +253,14 @@ class ConnectionDescriptor: public EventableDescriptor
245
253
  SslBox_t *SslBox;
246
254
  std::string CertChainFilename;
247
255
  std::string PrivateKeyFilename;
256
+ std::string CipherList;
257
+ std::string EcdhCurve;
258
+ std::string DhParam;
259
+ int Protocols;
248
260
  bool bHandshakeSignaled;
249
261
  bool bSslVerifyPeer;
262
+ bool bSslFailIfNoPeerCert;
263
+ std::string SniHostName;
250
264
  bool bSslPeerAccepted;
251
265
  #endif
252
266
 
@@ -275,7 +289,7 @@ class DatagramDescriptor
275
289
  class DatagramDescriptor: public EventableDescriptor
276
290
  {
277
291
  public:
278
- DatagramDescriptor (int, EventMachine_t*);
292
+ DatagramDescriptor (SOCKET, EventMachine_t*);
279
293
  virtual ~DatagramDescriptor();
280
294
 
281
295
  virtual void Read();
@@ -299,18 +313,18 @@ class DatagramDescriptor: public EventableDescriptor
299
313
 
300
314
  protected:
301
315
  struct OutboundPage {
302
- OutboundPage (const char *b, int l, struct sockaddr_in f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {}
316
+ OutboundPage (const char *b, int l, struct sockaddr_in6 f, int o=0): Buffer(b), Length(l), Offset(o), From(f) {}
303
317
  void Free() {if (Buffer) free (const_cast<char*>(Buffer)); }
304
318
  const char *Buffer;
305
319
  int Length;
306
320
  int Offset;
307
- struct sockaddr_in From;
321
+ struct sockaddr_in6 From;
308
322
  };
309
323
 
310
324
  deque<OutboundPage> OutboundPages;
311
325
  int OutboundDataSize;
312
326
 
313
- struct sockaddr_in ReturnAddress;
327
+ struct sockaddr_in6 ReturnAddress;
314
328
  };
315
329
 
316
330
 
@@ -321,7 +335,7 @@ class AcceptorDescriptor
321
335
  class AcceptorDescriptor: public EventableDescriptor
322
336
  {
323
337
  public:
324
- AcceptorDescriptor (int, EventMachine_t*);
338
+ AcceptorDescriptor (SOCKET, EventMachine_t*);
325
339
  virtual ~AcceptorDescriptor();
326
340
 
327
341
  virtual void Read();
@@ -344,7 +358,7 @@ class PipeDescriptor
344
358
  class PipeDescriptor: public EventableDescriptor
345
359
  {
346
360
  public:
347
- PipeDescriptor (int, pid_t, EventMachine_t*);
361
+ PipeDescriptor (SOCKET, pid_t, EventMachine_t*);
348
362
  virtual ~PipeDescriptor();
349
363
 
350
364
  virtual void Read();