summaryrefslogtreecommitdiff
path: root/ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp')
-rw-r--r--ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp467
1 files changed, 467 insertions, 0 deletions
diff --git a/ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp b/ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp
new file mode 100644
index 00000000000..bfda59cd09f
--- /dev/null
+++ b/ACE/netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp
@@ -0,0 +1,467 @@
+// $Id$
+
+#include "ace/Malloc_Base.h"
+#include "ace/Service_Config.h"
+#include "ace/Read_Buffer.h"
+#include "ace/Thread_Manager.h"
+
+// FUZZ: disable check_for_streams_include
+#include "ace/streams.h" /* Because dump () uses ofstream. */
+
+#include "Dump_Restore.h"
+#include "ace/OS_NS_signal.h"
+#include "ace/OS_NS_stdio.h"
+#include "ace/OS_NS_string.h"
+#include "ace/OS_NS_unistd.h"
+
+ACE_RCSID(Dump_Restore, Dump_Restore, "$Id$")
+
+Dump_Restore::Dump_Restore (int argc, ACE_TCHAR *argv[])
+ : infile_ (0)
+{
+ ACE_NEW (this->ns_context_,
+ ACE_Naming_Context);
+
+ // Cache the name options
+ this->name_options_ = this->ns_context_->name_options ();
+ this->name_options_->parse_args (argc, argv);
+
+ //determine name context
+ if (ACE_OS::strcmp (this->name_options_->nameserver_host (),
+ ACE_TEXT ("localhost")) == 0)
+ {
+ if (ns_context_->open (ACE_Naming_Context::PROC_LOCAL) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->open")));
+ }
+ else
+ {
+ // Don't really need to do this but it's a hack to fix the
+ // problme of Display () not printing the right hostname
+ ACE_OS::strcpy (this->hostname_,
+ this->name_options_->nameserver_host ());
+ this->port_ =
+ this->name_options_->nameserver_port ();
+
+ if (this->ns_context_->open (ACE_Naming_Context::NET_LOCAL) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->open")));
+ }
+
+ this->display_menu ();
+
+ if (ACE_Event_Handler::register_stdin_handler (this,
+ ACE_Reactor::instance (),
+ ACE_Thread_Manager::instance ()) == -1)
+ ACE_ERROR ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("register_stdin_handler")));
+}
+
+Dump_Restore::~Dump_Restore (void)
+{
+ // Deregister this handler with the ACE_Reactor.
+ ACE_Reactor::instance ()->remove_handler
+ (ACE_STDIN,
+ ACE_Event_Handler::DONT_CALL | ACE_Event_Handler::READ_MASK);
+
+ ACE_OS::fclose (this->infile_);
+}
+
+int
+Dump_Restore::handle_input (ACE_HANDLE)
+{
+ char option[BUFSIZ];
+ char buf1[BUFSIZ];
+ u_short port;
+
+ if (::scanf ("%s", option) <= 0)
+ {
+ ACE_DEBUG ((LM_ERROR,
+ ACE_TEXT ("try again\n")));
+ return 0;
+ }
+
+ switch (option[0])
+ {
+ case 'P' :
+ case 'p' :
+ set_proc_local ();
+ break;
+ case 'N' :
+ case 'n' :
+ set_node_local ();
+ break;
+ case 'H' :
+ case 'h' :
+ if (::scanf ("%s %hu", buf1, &port) <= 0)
+ break;
+ set_host (ACE_TEXT_CHAR_TO_TCHAR (buf1), port);
+ break;
+ case 'F':
+ case 'f':
+ if (::scanf ("%s", filename_) <= 0)
+ break;
+ if (this->infile_)
+ ACE_OS::fclose (this->infile_);
+ this->infile_ = fopen(filename_,"r");
+ break;
+ case 'B' :
+ case 'b' :
+ populate (Dump_Restore::BIND);
+ break;
+ case 'U' :
+ case 'u' :
+ populate (Dump_Restore::UNBIND);
+ break;
+ case 'R' :
+ case 'r' :
+ populate (Dump_Restore::REBIND);
+ break;
+ case 'D':
+ case 'd':
+ if (::scanf ("%s", dump_filename_) <= 0)
+ break;
+ this->dump ();
+ break;
+ case 'Q' :
+ case 'q' :
+ quit ();
+ break;
+ default :
+ ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Unrecognized command.\n")));
+ }
+
+ display_menu ();
+ return 0;
+}
+
+void
+Dump_Restore::display_menu (void)
+{
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Name Service Main Menu\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("----------------------\n")));
+
+ // Check if using local name space or remote name space
+ if (ACE_OS::strcmp (this->name_options_->nameserver_host (),
+ ACE_TEXT ("localhost")) == 0)
+ {
+ if (this->ns_scope_ == ACE_Naming_Context::PROC_LOCAL)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT (" *** Using Process Local Database ***\n\n")));
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT (" *** Using Node Local Database ***\n\n")));
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT (" Hostname: %s\n"),
+ this->hostname_));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT (" Port Number: %d\n"),
+ this->port_));
+ }
+
+ if (this->infile_)
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("Input File: %C\n"),
+ this->filename_));
+ else
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("** No Input File Specified **\n")));
+
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<P> Use Process Local Database\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<N> Use Node Local Database\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<H> Set Remote Name server <host> and <port>\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<F> Set Input File <file name>\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<B> Bind\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<U> Unbind\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<R> Rebind\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<D> Dump <file name>\n")));
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("<Q> or ^C (exit) \n")));
+}
+
+
+int
+Dump_Restore::set_proc_local (void)
+{
+ // Set Name Options
+ this->name_options_->nameserver_host (ACE_TEXT ("localhost"));
+ this->name_options_->nameserver_port (0);
+
+ // Set Naming Context scope
+ this->ns_scope_ =
+ ACE_Naming_Context::PROC_LOCAL;
+
+ // Remove old naming context
+ delete this->ns_context_;
+
+ // Create new Naming Context
+ ACE_NEW_RETURN (this->ns_context_,
+ ACE_Naming_Context,
+ -1);
+
+ if (this->ns_context_->open (ACE_Naming_Context::PROC_LOCAL) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->open")),
+ -1);
+
+ return 0;
+}
+
+int
+Dump_Restore::set_node_local (void)
+{
+ // Set Name Options
+ this->name_options_->nameserver_host (ACE_TEXT ("localhost"));
+ this->name_options_->nameserver_port (0);
+
+ // Set Naming Context scope
+ this->ns_scope_ = ACE_Naming_Context::NODE_LOCAL;
+
+ // Remove old naming context
+ delete this->ns_context_;
+
+ // Create new Naming Context
+ ACE_NEW_RETURN (this->ns_context_,
+ ACE_Naming_Context,
+ -1);
+
+ if (ns_context_->open (ACE_Naming_Context::NODE_LOCAL) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->open")),
+ -1);
+ return 0;
+}
+
+int
+Dump_Restore::set_host (const ACE_TCHAR *hostname,
+ int port)
+{
+ // Set Name Options
+ this->name_options_->nameserver_host (hostname);
+ this->name_options_->nameserver_port (port);
+
+ // Don't really need to do this but it's a hack to fix the problme
+ // of Display () not printing the right hostname
+ ACE_OS::strcpy (this->hostname_, hostname);
+ this->port_ = port;
+ this->ns_scope_ = ACE_Naming_Context::NET_LOCAL;
+
+ // remove old naming context
+ delete this->ns_context_;
+
+ // Create new Naming Context
+ ACE_NEW_RETURN (this->ns_context_,
+ ACE_Naming_Context,
+ -1);
+
+ // assume net_local context
+ if (ns_context_->open (ACE_Naming_Context::NET_LOCAL) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->open")),
+ -1);
+ return 0;
+}
+
+int
+Dump_Restore::doit (Dump_Restore::Operation_Type op,
+ const char *name,
+ const char *value,
+ const char *type)
+{
+ int result = -1;
+
+ switch (op)
+ {
+ case Dump_Restore::BIND:
+ {
+ result = this->bind (name, value, type);
+ break;
+ }
+ case Dump_Restore::UNBIND:
+ {
+ result = this->unbind (name);
+ break;
+ }
+ case Dump_Restore::REBIND:
+ {
+ result = this->rebind (name, value, type);
+ break;
+ }
+ }
+
+ return result;
+}
+
+int
+Dump_Restore::populate (Dump_Restore::Operation_Type op)
+{
+ if (this->infile_)
+ {
+ int result = -1;
+ enum State { NAME, VALUE, TYPE };
+
+ State state = NAME;
+ // reset file pointer
+ ACE_OS::rewind (this->infile_);
+
+ ACE_Allocator *allocator =
+ ACE_Allocator::instance ();
+ ACE_Read_Buffer read_buffer (this->infile_,
+ 0,
+ allocator);
+
+ for (char *temp;
+ (temp = read_buffer.read ('\n')) != 0;
+ )
+ {
+ char *name = 0;
+ const char *actual_name = 0;
+ char *value = 0;
+ const char *actual_value = 0;
+ char *type = 0;
+ const char *actual_type = 0;
+
+ switch (state)
+ {
+ case NAME:
+ name = temp;
+ ACE_OS::strtok (name, "=");
+ actual_name = ACE_OS::strtok (0, "=");
+ state = VALUE;
+ break;
+ case VALUE:
+ value = temp;
+ ACE_OS::strtok (value, "=");
+ actual_value = ACE_OS::strtok (0, "=");
+ state = TYPE;
+ break;
+ case TYPE:
+ type = temp;
+ ACE_OS::strtok (type, "=");
+ actual_type = ACE_OS::strtok (0, "=");
+
+ if (actual_type)
+ result = this->doit (op,
+ actual_name,
+ actual_value,
+ actual_type);
+ else
+ result = this->doit (op,
+ actual_name,
+ actual_value);
+ if (name)
+ allocator->free(name);
+ if (value)
+ allocator->free(value);
+ if (type)
+ allocator->free(type);
+ state = NAME;
+ break;
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("populate")),
+ -1);
+ /* NOTREACHED */
+ }
+ }
+
+ return result;
+ }
+ else
+ return -1;
+}
+
+int
+Dump_Restore::bind (const char *key,
+ const char *value,
+ const char *type)
+{
+ int result = ns_context_->bind (key,
+ value,
+ type);
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->bind")),
+ -1);
+ else if (result == 1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%s%s%s\n"),
+ ACE_TEXT ("key <"),
+ key,
+ ACE_TEXT ("> already bound")),
+ 1);
+ return 0;
+}
+
+int
+Dump_Restore::unbind (const char *key)
+{
+ int result = ns_context_->unbind (key);
+
+ if (result == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->unbind")),
+ -1);
+ return 0;
+}
+
+int
+Dump_Restore::rebind (const char *key,
+ const char *value,
+ const char *type)
+{
+ if (ns_context_->rebind (key,
+ value,
+ type) == -1)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ ACE_TEXT ("%p\n"),
+ ACE_TEXT ("ns_context_->rebind")),
+ -1);
+ return 0;
+}
+
+int
+Dump_Restore::quit (void)
+{
+ return ACE_OS::kill (ACE_OS::getpid (), SIGINT);
+}
+
+void
+Dump_Restore::dump (void)
+{
+ ofstream output_file (dump_filename_);
+
+ ostream *orig_stream = ACE_Log_Msg::instance ()->msg_ostream ();
+ ACE_Log_Msg::instance ()->msg_ostream (&output_file);
+ ACE_Log_Msg::instance ()->clr_flags (ACE_Log_Msg::STDERR | ACE_Log_Msg::LOGGER );
+ ACE_Log_Msg::instance ()->set_flags (ACE_Log_Msg::OSTREAM);
+
+ ns_context_->dump ();
+
+ ACE_Log_Msg::instance ()->msg_ostream (orig_stream);
+ ACE_Log_Msg::instance ()->clr_flags (ACE_Log_Msg::STDERR);
+}