summaryrefslogtreecommitdiff
path: root/ACE/examples/C++NPv2/TPC_Logging_Server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/examples/C++NPv2/TPC_Logging_Server.cpp')
-rw-r--r--ACE/examples/C++NPv2/TPC_Logging_Server.cpp106
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)
+