diff options
Diffstat (limited to 'ACE/examples/C++NPv2/TPC_Logging_Server.cpp')
-rw-r--r-- | ACE/examples/C++NPv2/TPC_Logging_Server.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv2/TPC_Logging_Server.cpp b/ACE/examples/C++NPv2/TPC_Logging_Server.cpp new file mode 100644 index 00000000000..b6ce76e1d40 --- /dev/null +++ b/ACE/examples/C++NPv2/TPC_Logging_Server.cpp @@ -0,0 +1,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) + |