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
