1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/*
** $Id$
**
** This is the Thread-per-connection logging server example from Chapter 7.
**
** Copyright 2002 Addison Wesley. All Rights Reserved.
*/
#include "ace/OS_NS_string.h"
#include "ace/FILE_Addr.h"
#include "ace/FILE_Connector.h"
#include "ace/os_include/os_netdb.h"
#include "Reactor_Logging_Server_Adapter.h"
#include "TPC_Logging_Server.h"
#include "TPCLS_export.h"
int TPC_Logging_Handler::open (void *) {
static const ACE_TCHAR LOGFILE_SUFFIX[] = ACE_TEXT (".log");
ACE_TCHAR filename[MAXHOSTNAMELEN + sizeof (LOGFILE_SUFFIX)];
ACE_INET_Addr logging_peer_addr;
peer ().get_remote_addr (logging_peer_addr);
logging_peer_addr.get_host_name (filename, MAXHOSTNAMELEN);
ACE_OS::strcat (filename, LOGFILE_SUFFIX);
ACE_FILE_Connector connector;
connector.connect (log_file_,
ACE_FILE_Addr (filename),
0, // No timeout.
ACE_Addr::sap_any, // Ignored.
0, // Don't try to reuse the addr.
O_RDWR | O_CREAT | O_APPEND,
ACE_DEFAULT_FILE_PERMS);
logging_handler_.peer ().set_handle (peer ().get_handle ());
return activate (THR_NEW_LWP | THR_DETACHED);
}
#if !defined (TPC_CERTIFICATE_FILENAME)
# define TPC_CERTIFICATE_FILENAME "tpc-cert.pem"
#endif /* !TPC_CERTIFICATE_FILENAME */
#if !defined (TPC_KEY_FILENAME)
# define TPC_KEY_FILENAME "tpc-key.pem"
#endif /* !TPC_KEY_FILENAME */
int TPC_Logging_Acceptor::open
(const ACE_SOCK_Acceptor::PEER_ADDR &local_addr,
ACE_Reactor *reactor,
int flags, int use_select, int reuse_addr) {
if (PARENT::open (local_addr, reactor, flags,
use_select, reuse_addr) != 0)
return -1;
OpenSSL_add_ssl_algorithms ();
ssl_ctx_ = SSL_CTX_new (SSLv3_server_method ());
if (ssl_ctx_ == 0) return -1;
if (SSL_CTX_use_certificate_file (ssl_ctx_,
TPC_CERTIFICATE_FILENAME,
SSL_FILETYPE_PEM) <= 0
|| SSL_CTX_use_PrivateKey_file (ssl_ctx_,
TPC_KEY_FILENAME,
SSL_FILETYPE_PEM) <= 0
|| !SSL_CTX_check_private_key (ssl_ctx_))
return -1;
ssl_ = SSL_new (ssl_ctx_);
return ssl_ == 0 ? -1 : 0;
}
int TPC_Logging_Acceptor::handle_close (ACE_HANDLE h,
ACE_Reactor_Mask mask) {
PARENT::handle_close (h, mask);
delete this;
return 0;
}
int TPC_Logging_Acceptor::accept_svc_handler
(TPC_Logging_Handler *sh) {
if (PARENT::accept_svc_handler (sh) == -1) return -1;
SSL_clear (ssl_); // Reset for new SSL connection.
#if defined (ACE_WIN32)
// ACE_WIN32 is the only platform where ACE_HANDLE is not an int.
// See ace/config-lite.h for the typedefs.
SSL_set_fd (ssl_, reinterpret_cast<int> (sh->get_handle ()));
#else
SSL_set_fd (ssl_, sh->get_handle ());
#endif /* ACE_WIN32 */
SSL_set_verify
(ssl_,
SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,
0);
if (SSL_accept (ssl_) == -1
|| SSL_shutdown (ssl_) == -1) return -1;
return 0;
}
typedef Reactor_Logging_Server_Adapter<TPC_Logging_Acceptor>
TPC_Logging_Server;
ACE_FACTORY_DEFINE (TPCLS, TPC_Logging_Server)
|