X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fsockaddr-util.c;h=28da531239f1a3807a19ae004c11df5514b1971a;hb=HEAD;hp=e58ffb39a8b65cd4ac1cc01380604aa6b5fc2906;hpb=fd48f3e498442f0cbff5f3606c7c403d0566150e;p=debian%2Famanda diff --git a/common-src/sockaddr-util.c b/common-src/sockaddr-util.c index e58ffb3..28da531 100644 --- a/common-src/sockaddr-util.c +++ b/common-src/sockaddr-util.c @@ -1,9 +1,10 @@ /* - * Copyright (c) 2007,2008 Zmanda, Inc. All Rights Reserved. + * Copyright (c) 2007-2012 Zmanda, Inc. All Rights Reserved. * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 as published - * by the Free Software Foundation. + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY @@ -23,6 +24,7 @@ * Utility routines for handling sockaddrs */ +#include "amanda.h" #include "sockaddr-util.h" void @@ -84,12 +86,58 @@ str_sockaddr( { inet_ntop(AF_INET, &sa->sin.sin_addr.s_addr, ipstr, sizeof(ipstr)); } - g_snprintf(mystr_sockaddr,sizeof(mystr_sockaddr),"%s.%d", ipstr, port); + g_snprintf(mystr_sockaddr,sizeof(mystr_sockaddr),"%s:%d", ipstr, port); mystr_sockaddr[sizeof(mystr_sockaddr)-1] = '\0'; return mystr_sockaddr; } +char * +str_sockaddr_no_port( + sockaddr_union *sa) +{ +#ifdef WORKING_IPV6 + char ipstr[INET6_ADDRSTRLEN]; +#else + char ipstr[INET_ADDRSTRLEN]; +#endif + +#ifdef WORKING_IPV6 + if ( SU_GET_FAMILY(sa) == AF_INET6) { + inet_ntop(AF_INET6, &sa->sin6.sin6_addr, ipstr, sizeof(ipstr)); + } else +#endif + { + inet_ntop(AF_INET, &sa->sin.sin_addr.s_addr, ipstr, sizeof(ipstr)); + } + g_snprintf(mystr_sockaddr,sizeof(mystr_sockaddr),"%s", ipstr); + mystr_sockaddr[sizeof(mystr_sockaddr)-1] = '\0'; + + return mystr_sockaddr; +} + +int +str_to_sockaddr( + const char *src, + sockaddr_union *dst) +{ + int result; + + g_debug("parsing %s", src); + /* try AF_INET first */ + SU_INIT(dst, AF_INET); + if ((result = inet_pton(AF_INET, src, &dst->sin.sin_addr)) == 1) + return result; + + /* otherwise try AF_INET6, if supported */ +#ifdef WORKING_IPV6 + SU_INIT(dst, AF_INET6); + return inet_pton(AF_INET6, src, &dst->sin6.sin6_addr); +#else + return result; +#endif +} + /* Unmap a V4MAPPED IPv6 address into its equivalent IPv4 address. The location * TMP is used to store the rewritten address, if necessary. Returns a pointer * to the unmapped address.