Looks Good.

Ethan

On Mon, Jul 25, 2011 at 12:29, Ben Pfaff <[email protected]> wrote:
> This is equivalent to lookup_ip() except that it accepts DNS names also.
> ---
>  lib/socket-util.c |   31 +++++++++++++++++++++++++++++++
>  lib/socket-util.h |    4 ++++
>  2 files changed, 35 insertions(+), 0 deletions(-)
>
> diff --git a/lib/socket-util.c b/lib/socket-util.c
> index 07687ba..c436724 100644
> --- a/lib/socket-util.c
> +++ b/lib/socket-util.c
> @@ -145,6 +145,37 @@ lookup_ipv6(const char *host_name, struct in6_addr *addr)
>     return 0;
>  }
>
> +/* Translates 'host_name', which must be a host name or a string 
> representation
> + * of an IP address, into a numeric IP address in '*addr'.  Returns 0 if
> + * successful, otherwise a positive errno value.
> + *
> + * Most Open vSwitch code should not use this because it causes deadlocks:
> + * gethostbyname() sends out a DNS request but that starts a new flow for 
> which
> + * OVS must set up a flow, but it can't because it's waiting for a DNS reply.
> + * The synchronous lookup also delays other activty.  (Of course we can solve
> + * this but it doesn't seem worthwhile quite yet.)  */
> +int
> +lookup_hostname(const char *host_name, struct in_addr *addr)
> +{
> +    struct hostent *h;
> +
> +    if (inet_aton(host_name, addr)) {
> +        return 0;
> +    }
> +
> +    h = gethostbyname(host_name);
> +    if (h) {
> +        *addr = *(struct in_addr *) h->h_addr;
> +        return 0;
> +    }
> +
> +    return (h_errno == HOST_NOT_FOUND ? ENOENT
> +            : h_errno == TRY_AGAIN ? EAGAIN
> +            : h_errno == NO_RECOVERY ? EIO
> +            : h_errno == NO_ADDRESS ? ENXIO
> +            : EINVAL);
> +}
> +
>  /* Returns the error condition associated with socket 'fd' and resets the
>  * socket's error status. */
>  int
> diff --git a/lib/socket-util.h b/lib/socket-util.h
> index 10f821e..ce7cd5b 100644
> --- a/lib/socket-util.h
> +++ b/lib/socket-util.h
> @@ -24,8 +24,12 @@
>
>  int set_nonblocking(int fd);
>  int get_max_fds(void);
> +
>  int lookup_ip(const char *host_name, struct in_addr *address);
>  int lookup_ipv6(const char *host_name, struct in6_addr *address);
> +
> +int lookup_hostname(const char *host_name, struct in_addr *);
> +
>  int get_socket_error(int sock);
>  int check_connection_completion(int fd);
>  int drain_rcvbuf(int fd);
> --
> 1.7.4.4
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
>
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to