X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=common-src%2Fsockaddr-util.c;h=041757575de264f3e394d975773d7b088f5be286;hb=0ab9787cd7de76aad522ee8d55ed7e87e3047458;hp=ffc6ca2faff88c8842dd8a6142e66d02d0ae2b9d;hpb=6ba576375c19b829b2a13dbe6562eedd2716b9ea;p=debian%2Famanda diff --git a/common-src/sockaddr-util.c b/common-src/sockaddr-util.c index ffc6ca2..0417575 100644 --- a/common-src/sockaddr-util.c +++ b/common-src/sockaddr-util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005 Zmanda Inc. All Rights Reserved. + * Copyright (c) 2007, 2008, 2010 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 @@ -14,8 +14,8 @@ * with this program; if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Contact information: Zmanda Inc, 505 N Mathlida Ave, Suite 120 - * Sunnyvale, CA 94085, USA, or: http://www.zmanda.com + * Contact information: Zmanda Inc, 465 S. Mathilda Ave., Suite 300 + * Sunnyvale, CA 94086, USA, or: http://www.zmanda.com * * Author: Dustin J. Mitchell */ @@ -23,6 +23,7 @@ * Utility routines for handling sockaddrs */ +#include "amanda.h" #include "sockaddr-util.h" void @@ -84,12 +85,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.