[Saga-devel] saga SVN commit 3312: /trunk/saga/saga/adaptors/utils/

Hartmut Kaiser hkaiser at cct.lsu.edu
Sat Jan 17 05:48:33 CST 2009


Andre,

> User: amerzky
> Date: 2009/01/17 05:00 AM
> 
> Modified:
>  /trunk/saga/saga/adaptors/utils/
>   utils.cpp, utils.hpp
> 
> Log:
>  add some simple network helper fuctions.
>  A

Please don't add non-portable code! utsname/uname() aren't supported on
Windows, for instance. The other functions are supported, though.
(gethostname, gethostbyname, gethostbyaddr, etc.).

Why don't you just use Boost.Asio to implement network related things?
Everything below could be expressed by just a couple of lines...

Regards Hartmut

BTW, did you see my mail the other day wrt the other helper functions you
added (head, tail, etc.) I really would like to see those be removed again
and being replaced by standard library constructs. 

> 
> File Changes:
> 
> Directory: /trunk/saga/saga/adaptors/utils/
> ===========================================
> 
> File [modified]: utils.cpp
> Delta lines: +138 -5
> ===================================================================
> --- trunk/saga/saga/adaptors/utils/utils.cpp	2009-01-17 10:59:24 UTC
> (rev 3311)
> +++ trunk/saga/saga/adaptors/utils/utils.cpp	2009-01-17 11:00:43 UTC
> (rev 3312)
> @@ -4,11 +4,17 @@
>  //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
> copy at
>  //  http://www.boost.org/LICENSE_1_0.txt)
> 
> -#ifndef SAGA_UTILS_HPP
> -#define SAGA_UTILS_HPP
> +#include <sys/socket.h>
> +#include <netdb.h>
> +#include <unistd.h>
> +#include <arpa/inet.h>
> +#include <sys/utsname.h>
> 
> -#include <saga/saga/adaptors/utils/ini/ini.hpp>
> -#include <saga/saga/adaptors/utils/process/process.hpp>
> +#include <set>
> +#include <string>
> +#include <vector>
> +
> +#include <saga/saga/adaptors/utils/utils.hpp>
> 
>  namespace saga
>  {
> @@ -134,10 +140,137 @@
>          return out;
>        }
> 
> +      bool  host_is_localhost (std::string host)
> +      {
> +        if ( host == "" )
> +        {
> +          host = "localhost";
> +        }
> 
> +        if ( host == saga::adaptors::utils::get_localhost () )
> +        {
> +          return true;
> +        }
> +
> +        return false;
> +      }
> +
> +
> +      // find FQHN for localhost
> +      std::string get_localhost (void)
> +      {
> +        std::vector <std::string> localhosts =
> saga::adaptors::utils::get_localhosts ();
> +
> +        // return first hostname which looks like a FQHN
> +        for ( int i = 0; i < localhosts.size (); i++ )
> +        {
> +          if ( std::string::npos != localhosts[i].find (".") )
> +            return localhosts[i];
> +        }
> +
> +        // none found
> +        return "";
> +      }
> +
> +      // find FQHN of localhost.  We return any hostname we find which
> has
> +      // a '.' in its name.
> +      std::vector <std::string> get_localhosts (void)
> +      {
> +        std::set    <std::string> initial_names;
> +        std::set    <std::string> names;
> +        std::vector <std::string> ret;
> +
> +        // default initial candidate
> +        initial_names.insert ("localhost");
> +
> +        // try to get hostname from uname
> +        struct utsname uts;
> +
> +        if ( ! ::uname (&uts) )
> +        {
> +          initial_names.insert (uts.nodename);
> +        }
> +
> +        // try gethostname()
> +        char hostname[256];
> +        if ( 0 == ::gethostname (hostname, 255) )
> +        {
> +          initial_names.insert (hostname);
> +        }
> +
> +
> +        // for all entries in the current set, find aliases via
> gethostbyname
> +        std::set <std::string> :: iterator it;
> +
> +        for ( it  = initial_names.begin ();
> +              it != initial_names.end ();
> +              it++ )
> +        {
> +          std::string initial_name = (*it);
> +
> +          // the initial name is a candidate of course
> +          names.insert (initial_name);
> +
> +          // get hostinfo for this one
> +          struct hostent * he = ::gethostbyname (initial_name.c_str
> ());
> +
> +          if ( NULL != he )
> +          {
> +            {
> +              // scan all aliases we found
> +              int j = 0;
> +              while ( he->h_aliases[j] != NULL )
> +              {
> +                names.insert (he->h_aliases[j]);
> +                j++;
> +              }
> +            }
> +
> +
> +            // get all addresses from hostinfo, and check them, too
> +            {
> +              struct in_addr ** addr_list = (struct in_addr **) he-
> >h_addr_list;
> +
> +              for ( int i = 0; addr_list[i] != NULL; i++)
> +              {
> +                struct hostent * he2 = ::gethostbyaddr (inet_ntoa
> (*addr_list[i]),
> +                                                        he->h_length,
> +                                                        he-
> >h_addrtype);
> +                if ( NULL != he2 )
> +                {
> +                  {
> +                    // scan all aliases we found
> +                    int j = 0;
> +                    while ( he2->h_aliases[j] != NULL )
> +                    {
> +                      names.insert (he2->h_aliases[j]);
> +                      j++;
> +                    }
> +                  }
> +                }
> +              }
> +            }
> +          }
> +        } // got hostinfo for all initiali names
> +
> +        // translate set into vector
> +        for ( it  = names.begin ();
> +              it != names.end ();
> +              it++ )
> +        {
> +          ret.push_back (*it);
> +        }
> +
> +        return ret;
> +      }
> +
> +      bool url_is_local (const saga::url & url)
> +      {
> +        return host_is_localhost (url.get_host ());
> +      }
> +
>      } // namespace utils
>    } // namespace adaptors
>  } // namespace saga
> 
> -#endif // SAGA_UTILS_HPP
> 
> 
> File [modified]: utils.hpp
> Delta lines: +8 -0
> ===================================================================
> --- trunk/saga/saga/adaptors/utils/utils.hpp	2009-01-17 10:59:24 UTC
> (rev 3311)
> +++ trunk/saga/saga/adaptors/utils/utils.hpp	2009-01-17 11:00:43 UTC
> (rev 3312)
> @@ -4,9 +4,11 @@
>  //  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or
> copy at
>  //  http://www.boost.org/LICENSE_1_0.txt)
> 
> +
>  #ifndef SAGA_UTILS_HPP
>  #define SAGA_UTILS_HPP
> 
> +#include <saga/saga/url.hpp>
>  #include <saga/saga/adaptors/utils/ini/ini.hpp>
>  #include <saga/saga/adaptors/utils/process/process.hpp>
> 
> @@ -26,6 +28,12 @@
>        std::vector <std::string> tac   (std::vector <std::string> in);
>        std::vector <std::string> grep  (std::string
> pattern,
>                                         std::vector <std::string> in);
> +
> +      std::string               get_localhost       (void);
> +      std::vector <std::string> get_localhosts      (void);
> +      bool                      host_is_localhost   (std::string
> host);
> +      bool                      url_is_local        (saga::url   url
> );
> +
>      } // namespace utils
>    } // namespace adaptors
>  } // namespace saga
> 
> _______________________________________________
> saga-devel mailing list
> saga-devel at cct.lsu.edu
> https://mail.cct.lsu.edu/mailman/listinfo/saga-devel



More information about the saga-devel mailing list