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

📄 inet.c

📁 基于linux下的故障录波前置程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,			    "malloc: %s", pcap_strerror(errno));			free(curaddr);			return (-1);		}	} else		curaddr->broadaddr = NULL;	if (dstaddr != NULL) {		curaddr->dstaddr = dup_sockaddr(dstaddr, dstaddr_size);		if (curaddr->dstaddr == NULL) {			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,			    "malloc: %s", pcap_strerror(errno));			free(curaddr);			return (-1);		}	} else		curaddr->dstaddr = NULL;	/*	 * Find the end of the list of addresses.	 */	for (prevaddr = curdev->addresses; prevaddr != NULL; prevaddr = nextaddr) {		nextaddr = prevaddr->next;		if (nextaddr == NULL) {			/*			 * This is the end of the list.			 */			break;		}	}	if (prevaddr == NULL) {		/*		 * The list was empty; this is the first member.		 */		curdev->addresses = curaddr;	} else {		/*		 * "prevaddr" is the last member of the list; append		 * this member to it.		 */		prevaddr->next = curaddr;	}	return (0);}intpcap_add_if(pcap_if_t **devlist, char *name, u_int flags,    const char *description, char *errbuf){	pcap_if_t *curdev;	return (add_or_find_if(&curdev, devlist, name, flags, description,	    errbuf));}/* * Free a list of interfaces. */voidpcap_freealldevs(pcap_if_t *alldevs){	pcap_if_t *curdev, *nextdev;	pcap_addr_t *curaddr, *nextaddr;	for (curdev = alldevs; curdev != NULL; curdev = nextdev) {		nextdev = curdev->next;		/*		 * Free all addresses.		 */		for (curaddr = curdev->addresses; curaddr != NULL; curaddr = nextaddr) {			nextaddr = curaddr->next;			if (curaddr->addr)				free(curaddr->addr);			if (curaddr->netmask)				free(curaddr->netmask);			if (curaddr->broadaddr)				free(curaddr->broadaddr);			if (curaddr->dstaddr)				free(curaddr->dstaddr);			free(curaddr);		}		/*		 * Free the name string.		 */		free(curdev->name);		/*		 * Free the description string, if any.		 */		if (curdev->description != NULL)			free(curdev->description);		/*		 * Free the interface.		 */		free(curdev);	}}#ifndef WIN32/* * Return the name of a network interface attached to the system, or NULL * if none can be found.  The interface must be configured up; the * lowest unit number is preferred; loopback is ignored. */char *pcap_lookupdev(errbuf)	register char *errbuf;{	pcap_if_t *alldevs;/* for old BSD systems, including bsdi3 */#ifndef IF_NAMESIZE#define IF_NAMESIZE IFNAMSIZ#endif	static char device[IF_NAMESIZE + 1];	char *ret;	if (pcap_findalldevs(&alldevs, errbuf) == -1)		return (NULL);	if (alldevs == NULL || (alldevs->flags & PCAP_IF_LOOPBACK)) {		/*		 * There are no devices on the list, or the first device		 * on the list is a loopback device, which means there		 * are no non-loopback devices on the list.  This means		 * we can't return any device.		 *		 * XXX - why not return a loopback device?  If we can't		 * capture on it, it won't be on the list, and if it's		 * on the list, there aren't any non-loopback devices,		 * so why not just supply it as the default device?		 */		(void)strlcpy(errbuf, "no suitable device found",		    PCAP_ERRBUF_SIZE);		ret = NULL;	} else {		/*		 * Return the name of the first device on the list.		 */		(void)strlcpy(device, alldevs->name, sizeof(device));		ret = device;	}	pcap_freealldevs(alldevs);	return (ret);}intpcap_lookupnet(device, netp, maskp, errbuf)	register const char *device;	register bpf_u_int32 *netp, *maskp;	register char *errbuf;{	register int fd;	register struct sockaddr_in *sin;	struct ifreq ifr;	/*	 * The pseudo-device "any" listens on all interfaces and therefore	 * has the network address and -mask "0.0.0.0" therefore catching	 * all traffic. Using NULL for the interface is the same as "any".	 */	if (!device || strcmp(device, "any") == 0#ifdef HAVE_DAG_API	    || strstr(device, "dag") != NULL#endif	    ) {		*netp = *maskp = 0;		return 0;	}	fd = socket(AF_INET, SOCK_DGRAM, 0);	if (fd < 0) {		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE, "socket: %s",		    pcap_strerror(errno));		return (-1);	}	memset(&ifr, 0, sizeof(ifr));#ifdef linux	/* XXX Work around Linux kernel bug */	ifr.ifr_addr.sa_family = AF_INET;#endif	(void)strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name));	if (ioctl(fd, SIOCGIFADDR, (char *)&ifr) < 0) {		if (errno == EADDRNOTAVAIL) {			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,			    "%s: no IPv4 address assigned", device);		} else {			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,			    "SIOCGIFADDR: %s: %s",			    device, pcap_strerror(errno));		}		(void)close(fd);		return (-1);	}	sin = (struct sockaddr_in *)&ifr.ifr_addr;	*netp = sin->sin_addr.s_addr;	if (ioctl(fd, SIOCGIFNETMASK, (char *)&ifr) < 0) {		(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,		    "SIOCGIFNETMASK: %s: %s", device, pcap_strerror(errno));		(void)close(fd);		return (-1);	}	(void)close(fd);	*maskp = sin->sin_addr.s_addr;	if (*maskp == 0) {		if (IN_CLASSA(*netp))			*maskp = IN_CLASSA_NET;		else if (IN_CLASSB(*netp))			*maskp = IN_CLASSB_NET;		else if (IN_CLASSC(*netp))			*maskp = IN_CLASSC_NET;		else {			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE,			    "inet class for 0x%x unknown", *netp);			return (-1);		}	}	*netp &= *maskp;	return (0);}#else /* WIN32 *//* * Return the name of a network interface attached to the system, or NULL * if none can be found.  The interface must be configured up; the * lowest unit number is preferred; loopback is ignored. */char *pcap_lookupdev(errbuf)	register char *errbuf;{	DWORD dwVersion;	DWORD dwWindowsMajorVersion;	dwVersion = GetVersion();	/* get the OS version */	dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));		if (dwVersion >= 0x80000000 && dwWindowsMajorVersion >= 4) {		/*		 * Windows 95, 98, ME.		 */		ULONG NameLength = 8192;		static char AdaptersName[8192];				PacketGetAdapterNames(AdaptersName,&NameLength);				return (AdaptersName);	} else {		/*		 * Windows NT (NT 4.0, W2K, WXP). Convert the names to UNICODE for backward compatibility		 */		ULONG NameLength = 8192;		static WCHAR AdaptersName[8192];		char *tAstr;		WCHAR *tUstr;		WCHAR *TAdaptersName = (WCHAR*)malloc(8192 * sizeof(WCHAR));		int NAdapts = 0;		if(TAdaptersName == NULL)		{			(void)snprintf(errbuf, PCAP_ERRBUF_SIZE, "memory allocation failure");			return NULL;		}		PacketGetAdapterNames((PTSTR)TAdaptersName,&NameLength);		tAstr = (char*)TAdaptersName;		tUstr = (WCHAR*)AdaptersName;		/*		 * Convert and copy the device names		 */		while(sscanf(tAstr, "%S", tUstr) > 0)		{			tAstr += strlen(tAstr) + 1;			tUstr += wcslen(tUstr) + 1;			NAdapts ++;		}		tAstr++;		*tUstr = 0;		tUstr++;		/*		 * Copy the descriptions		 */		while(NAdapts--)		{			strcpy((char*)tUstr, tAstr);			(char*)tUstr += strlen(tAstr) + 1;;			tAstr += strlen(tAstr) + 1;		}		return (char *)(AdaptersName);	}	}intpcap_lookupnet(device, netp, maskp, errbuf)	const register char *device;	register bpf_u_int32 *netp, *maskp;	register char *errbuf;{	/* 	 * We need only the first IPv4 address, so we must scan the array returned by PacketGetNetInfo()	 * in order to skip non IPv4 (i.e. IPv6 addresses)	 */	npf_if_addr if_addrs[MAX_NETWORK_ADDRESSES];	LONG if_addr_size = 1;	struct sockaddr_in *t_addr;	unsigned int i;	if (!PacketGetNetInfoEx((void *)device, if_addrs, &if_addr_size)) {		*netp = *maskp = 0;		return (0);	}	for(i=0; i<MAX_NETWORK_ADDRESSES; i++)	{		if(if_addrs[i].IPAddress.ss_family == AF_INET)		{			t_addr = (struct sockaddr_in *) &(if_addrs[i].IPAddress);			*netp = t_addr->sin_addr.S_un.S_addr;			t_addr = (struct sockaddr_in *) &(if_addrs[i].SubnetMask);			*maskp = t_addr->sin_addr.S_un.S_addr;			*netp &= *maskp;			return (0);		}					}	*netp = *maskp = 0;	return (0);}#endif /* WIN32 */

⌨️ 快捷键说明

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