[omniORB] ETS issues for upcoming 4.0 release

jon.kristensen@kongsberg-simrad.com jon.kristensen@kongsberg-simrad.com
Tue Sep 24 13:04:01 2002


--0__=C1256BAA004DAF8A8f9e8a93df938690918cC1256BAA004DAF8A
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: quoted-printable


Duncan,

Thanks a lot for your feedback.

This was several months ago, and I have lived with my fix for some time=
 now
- have not had time to investigate further. But I feel that this should=
 be
resolved before the final 4.0 release, so I have taken the time to look=
 at
this again.

The Win32 docs and ETS docs both says:

   "The gethostbyname function cannot resolve IP address strings passed=
 to
   it. Such a request is treated exactly as if an unknown host name wer=
e
   passed. Use inet_addr to convert an IP address string the string to =
an
   actual IP address, then use another function, gethostbyaddr, to obta=
in
   the contents of the hostent structure."

Your code certainly works under windows (contrary to what the documenta=
tion
says), but does not work under ETS (at least in my setup where DNS is
disabled).

Also, I want to quote from "UNIX network programming", Volume 1, Second=

edition, by W.Richard Steevens (Prentice Hall, 1997, ISBN 0-13-490012-X=
),
answer to problem 9.6 (how to make an DNS resolver accept dotted decima=
l IP
strings):

   "We call inet_pton first, as it is a fast, in-memory test for wether=
 or
   not the string is a valid dotted-decimal IP address. Only if this fa=
ils
   do we call gethostbyname, which typically involves some network
   resources and some time."

I do not have any newer UNIX references, but I get this feeling that
calling gethostbyname given a dotted-decimal address is not a good idea=
.
Btw, neither inet_aton nor inet_pton exist on windows, and that leaves
inet_addr on windows platforms. There is no mention of this function be=
eing
obsolete in the windows docs.

Talking about obsoleteness, the win32 docs do say:

   "Note=A0=A0The gethostbyname function has been deprecated by the
   introduction of the getaddrinfo function. Developers creating Window=
s
   Sockets 2 applications are urged to use the getaddrinfo function ins=
tead
   of gethostbyname."

However, changing this would create more problems for me as this functi=
on
is not available under ETS.

Back to my original fix to libcwrapper.cc (somewhat rewritten) :

line 205:
  #ifdef __atmos__
    if ((hp =3D ::gethostbyname(name)) <=3D 0)
      {
        rc =3D 0;
        non_reentrant.unlock();
        return -1;
      }
  #else
> #if defined(__WIN32__)
>  struct hostent myhp;
>   unsigned long addr =3D inet_addr(name);
>   if (addr !=3D INADDR_NONE)
>     {
>       // Fake a hostent structure based on our IP address
>       const char * Aliases[1] =3D { NULL };
>       const unsigned long * Adresses[2] =3D { &addr, NULL };
>
>       hp =3D &myhp;
>       hp->h_name      =3D (char*)name;
>       hp->h_aliases   =3D (char**)Aliases;
>       hp->h_addrtype  =3D PF_INET;
>       hp->h_length    =3D 4;
>       hp->h_addr_list =3D (char**)Adresses;
>     }
>
>   else
> #endif
    if ((hp =3D ::gethostbyname(name)) =3D=3D NULL)
      {
  #if defined(__WIN32__) || defined(__vms) && __VMS_VER < 70000000
      rc =3D 0;
  #else
  #ifdef __osr5__
      extern int h_errno;
  #endif
      rc =3D h_errno;
  #endif

      non_reentrant.unlock();
      return -1;
      }
  #endif

I would appreciate this or something like it to go into the 4.0 release=
.
However, as the current code seems to work with windows, I would be equ=
ally
happy if the "if defined(__WIN32__)" is replaced by "if defined
(__ETS_KERNEL__). But if the current code has a performance penalty (DN=
S
lookup), I feel that my fix is equally valid for all platforms. That sa=
id,
it may be that DNS is actually actively used on most non-embedded platf=
orms
and that makes this an unimportant problem in these cases.

--

I also have two other ETS issues:

in file tcpTransportImpl.cc, change line 93 from:

     #if defined(NTArchitecture) && !defined(__ETS_KERNEL__)

to:

     #if defined(NTArchitecture)

in file libcwrapper.h, change lines 80-88 from:

     if defined(__WIN32__)
     #  if !defined(__ETS_KERNEL__)
     #    include <winsock2.h>
     #  else
     #    include <winsock.h>
     #  endif
     #else
     #  include <netdb.h>
     #endif

to:

     #if defined(__WIN32__)
     #    include <winsock2.h>
     #else
     #  include <netdb.h>
     #endif

I have also added a zip file containing a small library (with VS 6.0 so=
urce
and project files) that needs to be linked in when using omniORB4.0 wit=
h
ETS. This library implements the WSAIOctl function required which is no=
t
supported by ETS.

     (See attached file: win32ext.zip)


I hope these issiues can be resolved in time for the final 4.0 release.=
 I
apologize for not submitting this earlier, but it is just a few days si=
nce
I realized that the final release was near completion.

Thanks for a good product.
Regards,
Jon

--------------
Jon Kristensen
Principal Engineer, SW Embedded Systems
Kongsberg Simrad AS, Horten, Norway
phone:    +47 33 02 39 34
fax: +47 33 04 76 19
email:    jon.kristensen@kongsberg-simrad.com






Duncan Grisby <duncan@grisby.org>@grisby.org on 29.04.2002 14:18:47
Internet mail from:

Sent by:  dpg1@grisby.org

To:   jon.kristensen@kongsberg-simrad.com
cc:   omniorb-list@uk.research.att.com

Subject:  Re: [omniORB] Some questions


On Monday 29 April, jon.kristensen@kongsberg-simrad.com wrote:

> There has been a bug report regarding WSAIoclt - SIO_ADDRESS_LIST_QUE=
RY
> under NT4.0, and the fix is supposed to be using SIO_GET_INTERFACE_LI=
ST
> instead. I got it working, but is this fix going in permanently?

The fix, and the one for the #define typo is now in SourceForge CVS.
See

  http://sourceforge.net/cvs/?group_id=3D51138

> Also, the code in tcpEndpoint.cc has changed a lot just before the Be=
ta1
> release, and no longer work in my configuration. I do not have a DNS
> running, and  gethostbyname() thus fails. Also, I am a little puzzled=
 by
> the latest changes. I expect the call to
> giopTransportImpl::getInterfaceAddress("giop:tcp") to return a list o=
f IP
> address strings, and do not see why you need to do DNS lookup on thes=
e.

gethostbyname() is meant to accept a numerical IP address, and convert
it to a hostent struct, without doing any sort of name lookup. It
seems to work OK on normal Windows. I assume it's an ETS oddity.
Here's the start of the Linux manpage, for example

       The gethostbyname() function returns a structure  of  type
       hostent  for  the  given host name.  Here name is either a
       host name, or an IPv4 address in standard dot notation, or
       an IPv6 address in colon (and possibly dot) notation. (See
       RFC 1884 for the description of IPv6 addresses.)  If  name
       is  an  IPv4  or  IPv6 address, no lookup is performed and
       gethostbyname() simply copies name into the  h_name  field
       and  its struct in_addr equivalent into the h_addr_list[0]
       field of the returned hostent structure.

If it really is an ETS problem, something like the fix you suggested
can go in an ifdef region. I say something like it, because
inet_addr() is supposedly obsolete, replaced by inet_aton()

Cheers,

Duncan.

--
 -- Duncan Grisby         --
  -- duncan@grisby.org     --
   -- http://www.grisby.org --



=

--0__=C1256BAA004DAF8A8f9e8a93df938690918cC1256BAA004DAF8A
Content-type: application/zip; 
	name="=?iso-8859-1?Q?win32ext.zip?="
Content-Disposition: attachment; filename="=?iso-8859-1?Q?win32ext.zip?="
Content-transfer-encoding: base64

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

--0__=C1256BAA004DAF8A8f9e8a93df938690918cC1256BAA004DAF8A--