[PATCH] New ORB_init option "ORBNetID=<string>"

Jules Colding <[email protected]>
Newsgroups gmane.comp.gnome.orbit.general
Message-ID <[email protected]>
Hi,

Remote ORBs might not be able to resolve object references generated by
ORBit2. The reason is that the short form of the hostname generally is
used. 

An example: 

* Imagine a host with the FQDN "thor.test.com" and the IP address
"10.0.3.2". ior-decode-2 will show that any locally generated IOR
resolves to "thor"

This will necessitate DNS or host configuration changes. It is therefore
necessary to introduce a new ORB_init option to control how host
resolvable names are generated by ORBit2.

The patch below introduces the ORB_init option "ORBNetID". The argument
is a string. The value of ORBLocalOnly will always take precedence to
preserve compatibility with current applications.

Possible values of ORBNetID is:

"local": all attempts to resolve the local host will be done using "localhost"
"short": all attempts to resolve the local host will be done using "thor".
"fqdn" : all attempts to resolve the local host will be done using "thor.test.com".
"ipaddr: all attempts to resolve the local host will be done using "10.0.3.2".

Patch against CVS HEAD below. Tested on Gentoo 2005.0 AMD64.

Please review. I'll commit in a week or so if no-one objects. 

Best regards,
  jules




? depcomp
? gtk-doc.make
? orbit2-zip
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/ORBit2/ChangeLog,v
retrieving revision 1.715
diff -u -p -r1.715 ChangeLog
--- ChangeLog	2 Jul 2005 11:55:24 -0000	1.715
+++ ChangeLog	25 Jul 2005 00:46:01 -0000
@@ -1,3 +1,14 @@
+2005-07-25  Jules Colding  <[email protected]>
+
+	* src/orb/orb-core/corba-orb.c: Added new ORB_init option, ORBNetID.
+	Valid values for a hypothetical local host (FQDN:thor.test.com, IP:10.0.3.2):
+	   "local": all attempts to resolve the local host will be done using "localhost"
+	   "short": all attempts to resolve the local host will be done using "thor".
+	   "fqdn" : all attempts to resolve the local host will be done using "thor.test.com".
+	   "ipaddr: all attempts to resolve the local host will be done using "10.0.3.2".
+	The new option will be evaluated after ORBLocalOnly but ORBLocalOnly will always take
+	precedence.
+
 2005-06-20  Fernando Herrera  <[email protected]>
 
 	* include/orbit/orb-core/corba-orb-type.h:
Index: linc2/ChangeLog
===================================================================
RCS file: /cvs/gnome/ORBit2/linc2/ChangeLog,v
retrieving revision 1.243
diff -u -p -r1.243 ChangeLog
--- linc2/ChangeLog	8 Jul 2005 22:59:57 -0000	1.243
+++ linc2/ChangeLog	25 Jul 2005 00:46:02 -0000
@@ -1,3 +1,19 @@
+2005-07-25  Jules Colding  <[email protected]>
+
+	* src/linc-protocols.c (get_netid): New function get_netid(). This 
+	function will full a preallocated buffer with a string describing 
+	the name of the local host according to the value of use_local_host.
+
+	link_get_local_hostname(): Modified to produce a resolvable hostname 
+	according to the value of use_local_host. This hostname will be used 
+	when composing IORs. 
+
+	use_local_host: Defaults now to LINK_NET_ID_IS_IPADDR fopr maximum
+	resolvability.
+
+	* include/linc/linc-protocol.h: Added new enum type "LinkNetIdType" to
+	use as argument in link_use_local_hostname().
+
 2005-07-09  Sebastian Rittau  <[email protected]>
 
 	* src/cleanup.c: (main): Use g_get_tmpdir() instead of hardcoding
Index: linc2/include/linc/linc-protocol.h
===================================================================
RCS file: /cvs/gnome/ORBit2/linc2/include/linc/linc-protocol.h,v
retrieving revision 1.21
diff -u -p -r1.21 linc-protocol.h
--- linc2/include/linc/linc-protocol.h	14 Apr 2005 13:00:26 -0000	1.21
+++ linc2/include/linc/linc-protocol.h	25 Jul 2005 00:46:02 -0000
@@ -70,12 +70,20 @@ struct _LinkProtocolInfo {
 	gpointer                    dummy[8];
 };
 
+typedef enum {
+	LINK_NET_ID_IS_LOCAL,
+	LINK_NET_ID_IS_SHORT_HOSTNAME,
+	LINK_NET_ID_IS_FQDN,
+	LINK_NET_ID_IS_IPADDR
+} LinkNetIdType;
+
+
 LinkProtocolInfo * const link_protocol_find     (const char *name);
 LinkProtocolInfo * const link_protocol_find_num (const int   family);
 LinkProtocolInfo * const link_protocol_all      (void);
 char                    *link_get_tmpdir        (void);
 void                     link_set_tmpdir        (const char *dir);
-void                     link_use_local_hostname (gboolean use);
+void                     link_use_local_hostname (LinkNetIdType use);
 const char*              link_get_local_hostname (void);
 
 G_END_DECLS
Index: linc2/src/linc-protocols.c
===================================================================
RCS file: /cvs/gnome/ORBit2/linc2/src/linc-protocols.c,v
retrieving revision 1.67
diff -u -p -r1.67 linc-protocols.c
--- linc2/src/linc-protocols.c	13 Apr 2005 11:40:07 -0000	1.67
+++ linc2/src/linc-protocols.c	25 Jul 2005 00:46:02 -0000
@@ -19,10 +19,13 @@
 
 #include <glib/gstdio.h>
 
+#include <net/if.h>
+#include <sys/ioctl.h>
+
 #undef LOCAL_DEBUG
 
 static char *link_tmpdir = NULL;
-static gboolean use_local_host = FALSE;
+static LinkNetIdType use_local_host = LINK_NET_ID_IS_IPADDR;
 
 /*
  * make_local_tmpdir:
@@ -124,22 +127,90 @@ link_get_tmpdir (void)
 #define LINK_RESOLV_UNSET_IPV6
 #endif
 
+static char *
+get_netid(LinkNetIdType which, 
+	  char *buf, 
+	  size_t len)
+{
+	if (LINK_NET_ID_IS_LOCAL == which)
+		return strncpy(buf, "localhost", len);
+
+	if (LINK_NET_ID_IS_IPADDR == which) {
+		struct ifreq my_ifreqs[2];
+		struct ifconf my_ifconf;
+		my_ifconf.ifc_len = sizeof(my_ifreqs);
+		my_ifconf.ifc_req = my_ifreqs;
+		int sock = socket(AF_INET,SOCK_DGRAM,0);
+		if (-1 == sock) 
+			goto out;;
+
+		if (ioctl(sock,SIOCGIFCONF,&my_ifconf) < 0) {
+			close(sock);
+			goto out;;
+		}
+		close(sock);
+
+		int num = my_ifconf.ifc_len / sizeof(struct ifreq);
+		if (!num) 
+			goto out;
+
+		int i;
+		struct sockaddr_in *adr = NULL;
+ 		for (i = 0; i < num; i++) {
+			adr = (struct sockaddr_in *)&my_ifreqs[i].ifr_ifru.ifru_addr;
+			if (strcmp("127.0.0.1", inet_ntoa((struct in_addr)adr->sin_addr)))
+				break;
+		}
+		// will be 127.0.0.1 anyway, if no other address is defined...
+		return strncpy(buf, (const char*)inet_ntoa((struct in_addr)adr->sin_addr), len);
+	}
+
+	if ((LINK_NET_ID_IS_SHORT_HOSTNAME == which) || (LINK_NET_ID_IS_FQDN == which)) {
+		if (gethostname(buf, len))
+			goto out;
+		if (errno == EINVAL)
+			goto out;
+
+		if (LINK_NET_ID_IS_SHORT_HOSTNAME == which) {
+			char *retv = buf;
+			while (*buf) {
+				if ('.' == *buf)
+					*buf = '\0';
+				buf++;
+			}
+			return retv;
+		}
+	}
+
+	if (LINK_NET_ID_IS_FQDN == which) {
+		struct addrinfo *result, hints;
+		memset(&hints, 0, sizeof(struct addrinfo));
+		hints.ai_flags = AI_CANONNAME;
+		if (!getaddrinfo(buf, NULL, &hints, &result)) {
+			strncpy(buf, result->ai_canonname, len);
+			freeaddrinfo(result);
+		} else
+			goto out;
+
+		return buf;
+	}
+
+out:
+	return NULL;
+}
 
 
 #if defined(AF_INET) || defined(AF_INET6) || defined (AF_UNIX)
 const char *
 link_get_local_hostname (void)
 {
-	static char local_host[NI_MAXHOST] = { 0 };
+	static char local_host[HOST_NAME_MAX] = { 0 };
 
-	if (use_local_host)
-		return "localhost";
-
-	if (local_host [0])
+	if (local_host[0])
 		return local_host;
 
-	if (gethostname (local_host, NI_MAXHOST) == -1)
-		return NULL;
+	get_netid(use_local_host, local_host, HOST_NAME_MAX);
+
 #ifdef G_OS_WIN32
 	{
 		/* Make sure looking up that name works */
@@ -166,7 +237,7 @@ link_get_local_hostname (void)
 }
 
 void
-link_use_local_hostname (gboolean use)
+link_use_local_hostname (LinkNetIdType use)
 {
         use_local_host = use;
 }
Index: src/orb/orb-core/corba-orb.c
===================================================================
RCS file: /cvs/gnome/ORBit2/src/orb/orb-core/corba-orb.c,v
retrieving revision 1.112
diff -u -p -r1.112 corba-orb.c
--- src/orb/orb-core/corba-orb.c	2 Jul 2005 11:55:25 -0000	1.112
+++ src/orb/orb-core/corba-orb.c	25 Jul 2005 00:46:03 -0000
@@ -49,6 +49,7 @@ static gboolean     orbit_use_irda      
 static gboolean     orbit_use_ssl            = FALSE;
 static gboolean     orbit_use_genuid_simple  = FALSE;
 static gboolean     orbit_local_only         = FALSE;
+static char        *orbit_net_id             = NULL;
 static gboolean     orbit_use_http_iors      = FALSE;
 static char        *orbit_ipsock             = NULL;
 static char        *orbit_ipname             = NULL;
@@ -74,8 +75,28 @@ ORBit_ORB_start_servers (CORBA_ORB orb)
 		create_options |= LINK_CONNECTION_LOCAL_ONLY;
 
 	if (orbit_local_only || (orbit_use_usocks && !(orbit_use_ipv4 || orbit_use_ipv6 || orbit_use_irda || orbit_use_ssl)))
-			link_use_local_hostname (TRUE);
-
+			link_use_local_hostname (LINK_NET_ID_IS_LOCAL);
+	else {
+		do {
+			if (!strcmp(orbit_net_id, "local")) {
+				link_use_local_hostname (LINK_NET_ID_IS_LOCAL);
+				break;
+			}
+			if (!strcmp(orbit_net_id, "short")) {
+				link_use_local_hostname (LINK_NET_ID_IS_SHORT_HOSTNAME);
+				break;
+			}
+			if (!strcmp(orbit_net_id, "fqdn")) {
+				link_use_local_hostname (LINK_NET_ID_IS_FQDN);
+				break;
+			}
+			if (!strcmp(orbit_net_id, "ipaddr")) {
+				link_use_local_hostname (LINK_NET_ID_IS_IPADDR);
+				break;
+			}
+		} while (0);
+	}
+		    
 	for (info = link_protocol_all (); info->name; info++) {
 		GIOPServer           *server;
 
@@ -1363,6 +1384,7 @@ const ORBit_option orbit_supported_optio
  	{ "ORBIIOPIPSock",      ORBIT_OPTION_STRING,  &orbit_ipsock },
 	{ "ORBInitialMsgLimit", ORBIT_OPTION_INT,     &orbit_initial_recv_limit },
 	{ "ORBLocalOnly",       ORBIT_OPTION_BOOLEAN, &orbit_local_only },
+ 	{ "ORBNetID",           ORBIT_OPTION_STRING,  &orbit_net_id },
 	/* warning: this option is a security risk unless used with LocalOnly */
 	{ "ORBIIOPIPv4",        ORBIT_OPTION_BOOLEAN, &orbit_use_ipv4 },
 	{ "ORBIIOPIPv6",        ORBIT_OPTION_BOOLEAN, &orbit_use_ipv6 },
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.