⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sockaddr-util.c

📁 开源备份软件源码 AMANDA, the Advanced Maryland Automatic Network Disk Archiver, is a backup system that a
💻 C
字号:
/* * Copyright (c) 2005 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 distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License * for more details. * * You should have received a copy of the GNU General Public License along * 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 * * Author: Dustin J. Mitchell <dustin@zmanda.com> *//* * Utility routines for handling sockaddrs */#include "sockaddr-util.h"voiddump_sockaddr(    struct sockaddr_storage *sa){#ifdef WORKING_IPV6    char ipstr[INET6_ADDRSTRLEN];#else    char ipstr[INET_ADDRSTRLEN];#endif    int port;    port = SS_GET_PORT(sa);#ifdef WORKING_IPV6    if (sa->ss_family == (sa_family_t)AF_INET6) {	inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr,		  ipstr, sizeof(ipstr));	dbprintf("(sockaddr_in6 *)%p = { %d, %d, %s }\n",		 sa,		 ((struct sockaddr_in6 *)sa)->sin6_family,		 port,		 ipstr);    } else#endif    {	inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, ipstr,		  sizeof(ipstr));	dbprintf("(sockaddr_in *)%p = { %d, %d, %s }\n",		 sa,		 ((struct sockaddr_in *)sa)->sin_family,		 port,		 ipstr);    }}#ifdef WORKING_IPV6static char mystr_sockaddr[INET6_ADDRSTRLEN + 20];#elsestatic char mystr_sockaddr[INET_ADDRSTRLEN + 20];#endifchar *str_sockaddr(    struct sockaddr_storage *sa){#ifdef WORKING_IPV6    char ipstr[INET6_ADDRSTRLEN];#else    char ipstr[INET_ADDRSTRLEN];#endif    int port;    port = SS_GET_PORT(sa);#ifdef WORKING_IPV6    if ( sa->ss_family == (sa_family_t)AF_INET6) {	inet_ntop(AF_INET6, &((struct sockaddr_in6 *)sa)->sin6_addr,		  ipstr, sizeof(ipstr));    } else#endif    {	inet_ntop(AF_INET, &((struct sockaddr_in *)sa)->sin_addr, ipstr,		  sizeof(ipstr));    }    g_snprintf(mystr_sockaddr,sizeof(mystr_sockaddr),"%s.%d", ipstr, port);    return mystr_sockaddr;}intcmp_sockaddr(    struct sockaddr_storage *ss1,    struct sockaddr_storage *ss2,    int addr_only){    /* if addresses are v4mapped, "unmap" them */#ifdef WORKING_IPV6#ifdef IN6_IS_ADDR_V4MAPPED    struct sockaddr_in ss1_v4;    struct sockaddr_in ss2_v4;    if (ss1->ss_family == AF_INET6 &&        IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)ss1)->sin6_addr)) {	memset(&ss1_v4, 0, sizeof(struct sockaddr_in));	memcpy(&ss1_v4.sin_addr.s_addr,	       &(((struct sockaddr_in6 *)ss1)->sin6_addr.s6_addr[12]),	       sizeof(struct in_addr));	ss1_v4.sin_family = AF_INET;	SS_SET_PORT((struct sockaddr_storage *)&ss1_v4, SS_GET_PORT(ss1));	ss1 = (struct sockaddr_storage *)&ss1_v4;    }    if (ss2->ss_family == AF_INET6 &&        IN6_IS_ADDR_V4MAPPED(&((struct sockaddr_in6 *)ss2)->sin6_addr)) {	memset(&ss2_v4, 0, sizeof(struct sockaddr_in));	memcpy(&ss2_v4.sin_addr.s_addr,	       &(((struct sockaddr_in6 *)ss2)->sin6_addr.s6_addr[12]),	       sizeof(struct in_addr));	ss2_v4.sin_family = AF_INET;	SS_SET_PORT((struct sockaddr_storage *)&ss2_v4, SS_GET_PORT(ss2));	ss2 = (struct sockaddr_storage *)&ss2_v4;    }#endif#endif    if (ss1->ss_family == ss2->ss_family) {        if (addr_only) {#ifdef WORKING_IPV6            if(ss1->ss_family == (sa_family_t)AF_INET6)                return memcmp(                    &((struct sockaddr_in6 *)ss1)->sin6_addr,                    &((struct sockaddr_in6 *)ss2)->sin6_addr,                    sizeof(((struct sockaddr_in6 *)ss1)->sin6_addr));            else#endif                return memcmp(                    &((struct sockaddr_in *)ss1)->sin_addr,                    &((struct sockaddr_in *)ss2)->sin_addr,                    sizeof(((struct sockaddr_in *)ss1)->sin_addr));        } else {            return memcmp(ss1, ss2, SS_LEN(ss1));        }    } else {        /* compare families to give a total order */        if (ss1->ss_family < ss2->ss_family)            return -1;        else            return 1;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -