summaryrefslogtreecommitdiff
path: root/TAO/utils/nslist/nsadd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/utils/nslist/nsadd.cpp')
-rw-r--r--TAO/utils/nslist/nsadd.cpp436
1 files changed, 436 insertions, 0 deletions
diff --git a/TAO/utils/nslist/nsadd.cpp b/TAO/utils/nslist/nsadd.cpp
new file mode 100644
index 00000000000..055d25e55ee
--- /dev/null
+++ b/TAO/utils/nslist/nsadd.cpp
@@ -0,0 +1,436 @@
+// $Id$
+
+// ================================================================
+//
+// = LIBRARY
+// utils
+//
+// = FILENAME
+// nsadd.cpp
+//
+// = DESCRIPTION
+// Naming Service add utility
+//
+// = AUTHOR
+// Carlos O'Ryan
+// enhanced Nov 6, 2002 Paul Caffrey <denginere@hotmail.com>
+// redone Jun 21 2006 Simon Massey <sma@prismtech.com>
+//
+// ================================================================
+
+#include "orbsvcs/CosNamingC.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+#include "ace/Argv_Type_Converter.h"
+
+CORBA::ORB_var orb;
+int showIOR = 0;
+int showNSonly = 0;
+
+int
+ACE_TMAIN (int argcw, ACE_TCHAR *argvw[])
+{
+ CosNaming::Name the_name (0);
+ CORBA::ORB_var orb;
+ const char *ior = 0;
+
+ try
+ {
+ // Contact the orb
+ ACE_Argv_Type_Converter argcon (argcw, argvw);
+ orb = CORBA::ORB_init (argcon.get_argc (), argcon.get_ASCII_argv (),
+ "");
+
+ // Scan through the command line options
+ bool
+ failed = false,
+ quiet = false,
+ rebind = false,
+ context = false;
+ int
+ argc = argcon.get_argc ();
+ ACE_TCHAR
+ **argv = argcon.get_TCHAR_argv ();
+ const char
+ *const pname = ACE_TEXT_ALWAYS_CHAR (argv[0]),
+ *nameService = 0;
+ char
+ kindsep= '.',
+ ctxsep[]= "/",
+ *name = 0;
+
+ if (0 < argc)
+ {
+ while (--argc > 0)
+ {
+ ++argv;
+ if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--ns")))
+ {
+ if (!--argc)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --ns requires an argument\n"));
+ failed= true;
+ }
+ else
+ {
+ ++argv;
+ if (nameService)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: more than one --ns.\n"));
+ failed= true;
+ }
+ else
+ nameService = ACE_TEXT_ALWAYS_CHAR (*argv);
+ }
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT("--quiet")))
+ {
+ quiet = true;
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--name")))
+ {
+ if (name)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: more than one --name\n"));
+ failed = true;
+ }
+ else if (!--argc)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --name requires an argument\n"));
+ failed = true;
+ }
+ else
+ name = ACE_TEXT_ALWAYS_CHAR (*++argv);
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--ctxsep")))
+ {
+ if (!--argc)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --ctxsep requires a character\n"));
+ failed = true;
+ }
+ else if (1 != ACE_OS::strlen(*++argv))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --ctxsep takes a single character (not %s)\n", *argv));
+ failed = true;
+ }
+ else
+ ctxsep[0] = ACE_TEXT_ALWAYS_CHAR (*argv)[0];
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--kindsep")))
+ {
+ if (!--argc)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --kindsep requires a character\n"));
+ failed = true;
+ }
+ else if (1 != ACE_OS::strlen(*++argv))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --kindsep takes a single character (not %s)\n", *argv));
+ failed = true;
+ }
+ else
+ kindsep = ACE_TEXT_ALWAYS_CHAR (*argv)[0];
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--ior")))
+ {
+ if (ior)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: ior already specified\n"));
+ failed = true;
+ }
+ else if (!--argc)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: --ior requires an IOR\n"));
+ failed = true;
+ }
+ else
+ ior = ACE_TEXT_ALWAYS_CHAR (*++argv);
+ }
+ else if ((0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--ctx")))
+ ||(0 == ACE_OS::strcmp(*argv, ACE_TEXT ("--newcontext"))))
+ {
+ context = true;
+ }
+ else if (0 == ACE_OS::strcmp (*argv, ACE_TEXT ("--rebind")))
+ {
+ rebind = true;
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Unknown option %s\n", ACE_TEXT_ALWAYS_CHAR (*argv)));
+ failed = true;
+ }
+ }
+ }
+
+ if (failed || !name || (!ior && !context))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "\nUsage:\n"
+ " %s --name <name> --ior <ior>\n"
+ " %s --name <name> --ctx\n"
+ " %s --name <name> --ior <ior> --ctx\n"
+ "optional:\n"
+ " --ns <ior>\n"
+ " --rebind\n"
+ " --ctxsep <character>\n"
+ " --kindsep <character>\n"
+ " --newcontext {same as --ctx}\n"
+ " --quiet\n\n"
+ "where <name> uses the --ctxsep (defaults to /) to separate\n"
+ "sub-contexts and --kindsep (defaults to .) to separate ID\n"
+ "and Kind. If --ctx is NOT given; binds a final object.\n"
+ "If --ctx is given without --ior; binds a new naming context.\n"
+ "If both --ior and --ctx are specified; binds the existing\n"
+ "naming context specified. If --rebind is given, will replace\n"
+ "existing bindings of the same type (object or context).\n"
+ "Connects to the default NameService unless --ns is given.\n"
+ "Displays all ID/Kinds found/created on path unless --quiet\n"
+ "is given.\n",
+ pname, pname, pname));
+ orb->destroy ();
+ return 1;
+ }
+
+ // Contact the name service
+ CORBA::Object_var nc_obj;
+ if (nameService)
+ nc_obj = orb->string_to_object (nameService);
+ else
+ nc_obj = orb->resolve_initial_references ("NameService");
+
+ CosNaming::NamingContext_var root_nc =
+ CosNaming::NamingContext::_narrow (nc_obj.in ());
+ if (CORBA::is_nil (root_nc.in ()))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Error: nil naming context\n"));
+ orb->destroy ();
+ return 1;
+ }
+
+ // Get the object reference from the IOR string given
+ CORBA::Object_var obj;
+ if (ior)
+ {
+ obj = orb->string_to_object (ior);
+ }
+
+ // Assemble the name from the user string given
+ char *cp;
+ while (0 != (cp = ACE_OS::strtok (name, ctxsep)))
+ {
+ const int index= the_name.length();
+ the_name.length (index+1);
+ char *kind = (char *)ACE_OS::strchr (cp, kindsep);
+ if (kind)
+ {
+ *kind = '\0';
+ the_name[index].kind= CORBA::string_dup (++kind);
+ }
+ the_name[index].id = CORBA::string_dup (cp);
+ name = 0; // way strtok works
+ }
+
+ // Now attempt the (re)bind
+ try
+ {
+ if (!ior)
+ obj= root_nc->bind_new_context (the_name);
+ else if (context)
+ {
+ CosNaming::NamingContext_var this_nc =
+ CosNaming::NamingContext::_narrow (obj.in ());
+
+ if (rebind)
+ root_nc->rebind_context (the_name, this_nc.in ());
+ else
+ root_nc->bind_context (the_name, this_nc.in ());
+ }
+ else if (rebind)
+ root_nc->rebind (the_name, obj.in ());
+ else
+ root_nc->bind (the_name, obj.in ());
+ if (!quiet)
+ {
+ unsigned int index;
+ for (index= 0u; index < the_name.length()-1u; ++index)
+ {
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, "Found ID: %s (Kind: %s)\n",
+ the_name[index].id.in(),
+ the_name[index].kind.in()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "Found ID: %s\n",
+ the_name[index].id.in()));
+ }
+ if (!ior)
+ ACE_DEBUG ((LM_DEBUG, "Created sub-context"));
+ else if (rebind)
+ ACE_DEBUG ((LM_DEBUG, "ReBound"));
+ else
+ ACE_DEBUG ((LM_DEBUG, "Bound"));
+ ACE_DEBUG ((LM_DEBUG, " ID: %s",
+ the_name[index].id.in()));
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, " (Kind: %s)\n",
+ the_name[index].kind.in()));
+ ACE_DEBUG ((LM_DEBUG, "\n"));
+ }
+ }
+ catch (const CosNaming::NamingContext::NotFound& nf)
+ {
+ if (CosNaming::NamingContext::missing_node != nf.why)
+ throw; // report error to outer try/catch
+
+ CosNaming::Name fullName (the_name);
+ int
+ index,
+ found= the_name.length() - nf.rest_of_name.length(),
+ &limit= found;
+ if (quiet)
+ index= found;
+ else
+ {
+ for (index= 0; index < found; ++index)
+ {
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, "Found ID: %s (Kind: %s)\n",
+ the_name[index].id.in(),
+ the_name[index].kind.in()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "Found ID: %s\n",
+ the_name[index].id.in()));
+ }
+ }
+
+ // need to create the following missing naming contexts
+ limit= fullName.length() - ((ior)?1:0);
+ while (index < limit)
+ {
+ // As soon as we limit the length, later names are gone so
+ // we have to recopy them.
+ the_name.length( index + 1 );
+ the_name[index].id= CORBA::string_dup (fullName[index].id);
+ the_name[index].kind= CORBA::string_dup (fullName[index].kind);
+
+ if (!quiet)
+ {
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, "Creating sub-context ID: %s (Kind: %s)\n",
+ the_name[index].id.in(),
+ the_name[index].kind.in()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "Creating sub-context ID: %s\n",
+ the_name[index].id.in()));
+ }
+
+ CosNaming::NamingContext_var this_nc =
+ root_nc->bind_new_context (the_name);
+// report error to outer try/catch
+ ++index;
+ }
+
+ if (ior)
+ {
+ // As soon as we limit the length, later names are gone so
+ // we have to recopy them.
+ the_name.length( index + 1 );
+ the_name[index].id= CORBA::string_dup (fullName[index].id);
+ the_name[index].kind= CORBA::string_dup (fullName[index].kind);
+ if (!quiet)
+ {
+ if (rebind)
+ ACE_DEBUG ((LM_DEBUG, "Re"));
+ ACE_DEBUG ((LM_DEBUG, "Binding ID: %s",
+ the_name[index].id.in()));
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, " (Kind: %s)\n",
+ the_name[index].kind.in()));
+ ACE_DEBUG ((LM_DEBUG, "\n"));
+ }
+ // Now re-attempt the (re)bind
+ if (context)
+ {
+ CosNaming::NamingContext_var this_nc =
+ CosNaming::NamingContext::_narrow (obj.in ());
+// This is not a naming context, report to outer
+
+ if (rebind)
+ root_nc->rebind_context (the_name, this_nc.in ());
+ else
+ root_nc->bind_context (the_name, this_nc.in ());
+ }
+ else if (rebind)
+ root_nc->rebind (the_name, obj.in ());
+ else
+ root_nc->bind (the_name, obj.in ());
+ }
+ }
+ }
+ catch (const CosNaming::NamingContext::NotFound& nf)
+ {
+ unsigned int index;
+ ACE_DEBUG ((LM_DEBUG, "\nError:\n"));
+ for (index= 0u; index < the_name.length()-nf.rest_of_name.length(); ++index)
+ {
+ if (the_name[index].kind && the_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, "ID: %s (Kind: %s)\n",
+ the_name[index].id.in(),
+ the_name[index].kind.in()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "ID: %s\n",
+ the_name[index].id.in()));
+ }
+ const char *why= "Unknown reason";
+ switch (nf.why)
+ {
+ case CosNaming::NamingContext::missing_node:
+ why= "\nThe following node is missing";
+ break;
+ case CosNaming::NamingContext::not_context:
+ why= "\nThe following is a final object binding, not a naming context";
+ break;
+ case CosNaming::NamingContext::not_object:
+ why= "\nThe following is a naming context, not a final object binding";
+ break;
+ }
+ nf._tao_print_exception (why);
+ for (index= 0u; index < nf.rest_of_name.length(); ++index)
+ {
+ if (nf.rest_of_name[index].kind && nf.rest_of_name[index].kind[0])
+ ACE_DEBUG ((LM_DEBUG, "ID: %s (Kind: %s)\n",
+ nf.rest_of_name[index].id.in(),
+ nf.rest_of_name[index].kind.in()));
+ else
+ ACE_DEBUG ((LM_DEBUG, "ID: %s\n",
+ nf.rest_of_name[index].id.in()));
+ }
+ orb->destroy ();
+ return 1;
+ }
+ catch (const CORBA::Exception& ex)
+ {
+ ACE_DEBUG ((LM_DEBUG, "\nError:\n"));
+ ex._tao_print_exception ("Exception in nsadd");
+ orb->destroy ();
+ return 1;
+ }
+
+ orb->destroy ();
+ return 0;
+}
+
+