On Thu, Jan 23, 2014 at 7:24 PM, Yann Ylavic <ylavic....@gmail.com> wrote:

> Hi,
>
> I'd like to propose the following/attached patch which adds the
> apr_sockaddr_info_copy() function to network_io.
>

Committed to APR trunk as r1587045...

If you are able, could you submit a patch to add a testcase for this?  Even
if the testcase isn't interesting, it would be a big head start in case
someone has a need to test a particular aspect of it in the future.  Thanks!


>
> It can be useful when one wants an existing apr_sockaddr_t with a
> different lifetime (pool) without a DNS lookup, ie. a redundant/costly call
> to apr_sockaddr_info_get().
>
> I hope it can be useful.
>
> Regards,
> Yann.
>
>
> Index: include/apr_network_io.h
> ===================================================================
> --- include/apr_network_io.h    (revision 1560855)
> +++ include/apr_network_io.h    (working copy)
> @@ -428,6 +428,15 @@ APR_DECLARE(apr_status_t) apr_sockaddr_info_get(ap
>                                            apr_int32_t flags,
>                                            apr_pool_t *p);
>
> +/**
> + * Copy apr_sockaddr_t src to dst on pool p.
> + * @param dst The destination apr_sockaddr_t.
> + * @param src The source apr_sockaddr_t.
> + * @param p The pool for the apr_sockaddr_t and associated storage.
> + */
> +APR_DECLARE(apr_status_t) apr_sockaddr_info_copy(apr_sockaddr_t **dst,
> +                                                 const apr_sockaddr_t
> *src,
> +                                                 apr_pool_t *p);
>
>  /**
>   * Look up the host name from an apr_sockaddr_t.
> Index: network_io/unix/sockaddr.c
> ===================================================================
> --- network_io/unix/sockaddr.c    (revision 1560855)
> +++ network_io/unix/sockaddr.c    (working copy)
> @@ -660,6 +660,41 @@ APR_DECLARE(apr_status_t) apr_sockaddr_info_get(ap
>      return find_addresses(sa, hostname, family, port, flags, p);
>  }
>
> +APR_DECLARE(apr_status_t) apr_sockaddr_info_copy(apr_sockaddr_t **dst,
> +                                                 const apr_sockaddr_t
> *src,
> +                                                 apr_pool_t *p)
> +{
> +    apr_sockaddr_t *d;
> +    const apr_sockaddr_t *s;
> +    for (*dst = d = NULL, s = src; s; s = s->next) {
> +        if (!d) {
> +            *dst = d = apr_pmemdup(p, s, sizeof *s);
> +        }
> +        else {
> +            d = d->next = apr_pmemdup(p, s, sizeof *s);
> +        }
> +        if (s->hostname) {
> +            if (s == src || s->hostname != src->hostname) {
> +                d->hostname = apr_pstrdup(p, s->hostname);
> +            }
> +            else {
> +                d->hostname = (*dst)->hostname;
> +            }
> +        }
> +        if (s->servname) {
> +            if (s == src || s->servname != src->servname) {
> +                d->servname = apr_pstrdup(p, s->servname);
> +            }
> +            else {
> +                d->servname = (*dst)->servname;
> +            }
> +        }
> +        d->pool = p;
> +        apr_sockaddr_vars_set(d, s->family, s->port);
> +    }
> +    return APR_SUCCESS;
> +}
> +
>  APR_DECLARE(apr_status_t) apr_getnameinfo(char **hostname,
>                                            apr_sockaddr_t *sockaddr,
>                                            apr_int32_t flags)
> [EOS]
>



-- 
Born in Roswell... married an alien...
http://emptyhammock.com/
http://edjective.org/

Reply via email to