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

📄 nametoaddr.c

📁 Windows XP下的抓包程序实现
💻 C
字号:
/* * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998 *	The Regents of the University of California.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Name to id translation routines used by the scanner. * These functions are not time critical. */#ifndef lintstatic const char rcsid[] _U_ =    "@(#) $Header: /tcpdump/master/libpcap/nametoaddr.c,v 1.77.2.3 2005/04/20 11:13:51 guy Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef WIN32#include <pcap-stdinc.h>#else /* WIN32 */#include <sys/param.h>#include <sys/types.h>				/* concession to AIX */#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#endif /* WIN32 *//* * XXX - why was this included even on UNIX? */#ifdef __MINGW32__#include "IP6_misc.h"#endif#ifndef WIN32#ifdef HAVE_ETHER_HOSTTON/* * XXX - do we need any of this if <netinet/if_ether.h> doesn't declare * ether_hostton()? */#ifdef HAVE_NETINET_IF_ETHER_Hstruct mbuf;		/* Squelch compiler warnings on some platforms for */struct rtentry;		/* declarations in <net/if.h> */#include <net/if.h>	/* for "struct ifnet" in "struct arpcom" on Solaris */#include <netinet/if_ether.h>#endif /* HAVE_NETINET_IF_ETHER_H */#ifdef NETINET_ETHER_H_DECLARES_ETHER_HOSTTON#include <netinet/ether.h>#endif /* NETINET_ETHER_H_DECLARES_ETHER_HOSTTON */#endif /* HAVE_ETHER_HOSTTON */#include <arpa/inet.h>#include <netdb.h>#endif /* WIN32 */#include <ctype.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include "pcap-int.h"#include "gencode.h"#include <pcap-namedb.h>#ifdef HAVE_OS_PROTO_H#include "os-proto.h"#endif#ifndef NTOHL#define NTOHL(x) (x) = ntohl(x)#define NTOHS(x) (x) = ntohs(x)#endifstatic inline int xdtoi(int);/* *  Convert host name to internet address. *  Return 0 upon failure. */bpf_u_int32 **pcap_nametoaddr(const char *name){#ifndef h_addr	static bpf_u_int32 *hlist[2];#endif	bpf_u_int32 **p;	struct hostent *hp;	if ((hp = gethostbyname(name)) != NULL) {#ifndef h_addr		hlist[0] = (bpf_u_int32 *)hp->h_addr;		NTOHL(hp->h_addr);		return hlist;#else		for (p = (bpf_u_int32 **)hp->h_addr_list; *p; ++p)			NTOHL(**p);		return (bpf_u_int32 **)hp->h_addr_list;#endif	}	else		return 0;}#ifdef INET6struct addrinfo *pcap_nametoaddrinfo(const char *name){	struct addrinfo hints, *res;	int error;	memset(&hints, 0, sizeof(hints));	hints.ai_family = PF_UNSPEC;	hints.ai_socktype = SOCK_STREAM;	/*not really*/	hints.ai_protocol = IPPROTO_TCP;	/*not really*/	error = getaddrinfo(name, NULL, &hints, &res);	if (error)		return NULL;	else		return res;}#endif /*INET6*//* *  Convert net name to internet address. *  Return 0 upon failure. */bpf_u_int32pcap_nametonetaddr(const char *name){#ifndef WIN32	struct netent *np;	if ((np = getnetbyname(name)) != NULL)		return np->n_net;	else		return 0;#else	/*	 * There's no "getnetbyname()" on Windows.	 */	return 0;#endif}/* * Convert a port name to its port and protocol numbers. * We assume only TCP or UDP. * Return 0 upon failure. */intpcap_nametoport(const char *name, int *port, int *proto){	struct servent *sp;	int tcp_port = -1;	int udp_port = -1;	/*	 * We need to check /etc/services for ambiguous entries.	 * If we find the ambiguous entry, and it has the	 * same port number, change the proto to PROTO_UNDEF	 * so both TCP and UDP will be checked.	 */	sp = getservbyname(name, "tcp");	if (sp != NULL) tcp_port = ntohs(sp->s_port);	sp = getservbyname(name, "udp");	if (sp != NULL) udp_port = ntohs(sp->s_port);	if (tcp_port >= 0) {		*port = tcp_port;		*proto = IPPROTO_TCP;		if (udp_port >= 0) {			if (udp_port == tcp_port)				*proto = PROTO_UNDEF;#ifdef notdef			else				/* Can't handle ambiguous names that refer				   to different port numbers. */				warning("ambiguous port %s in /etc/services",					name);#endif		}		return 1;	}	if (udp_port >= 0) {		*port = udp_port;		*proto = IPPROTO_UDP;		return 1;	}#if defined(ultrix) || defined(__osf__)	/* Special hack in case NFS isn't in /etc/services */	if (strcmp(name, "nfs") == 0) {		*port = 2049;		*proto = PROTO_UNDEF;		return 1;	}#endif	return 0;}/* * Convert a string in the form PPP-PPP, where correspond to ports, to * a starting and ending port in a port range. * Return 0 on failure. */intpcap_nametoportrange(const char *name, int *port1, int *port2, int *proto){	u_int p1, p2;	char *off, *cpy;	int save_proto;	if (sscanf(name, "%d-%d", &p1, &p2) != 2) {		if ((cpy = strdup(name)) == NULL)			return 0;		if ((off = strchr(cpy, '-')) == NULL) {			free(cpy);			return 0;		}		*off = '\0';		if (pcap_nametoport(cpy, port1, proto) == 0) {			free(cpy);			return 0;		}		save_proto = *proto;		if (pcap_nametoport(off + 1, port2, proto) == 0) {			free(cpy);			return 0;		}		if (*proto != save_proto)			*proto = PROTO_UNDEF;	} else {		*port1 = p1;		*port2 = p2;		*proto = PROTO_UNDEF;	}	return 1;}intpcap_nametoproto(const char *str){	struct protoent *p;	p = getprotobyname(str);	if (p != 0)		return p->p_proto;	else		return PROTO_UNDEF;}#include "ethertype.h"struct eproto {	char *s;	u_short p;};/* Static data base of ether protocol types. */struct eproto eproto_db[] = {	{ "pup", ETHERTYPE_PUP },	{ "xns", ETHERTYPE_NS },	{ "ip", ETHERTYPE_IP },#ifdef INET6	{ "ip6", ETHERTYPE_IPV6 },#endif	{ "arp", ETHERTYPE_ARP },	{ "rarp", ETHERTYPE_REVARP },	{ "sprite", ETHERTYPE_SPRITE },	{ "mopdl", ETHERTYPE_MOPDL },	{ "moprc", ETHERTYPE_MOPRC },	{ "decnet", ETHERTYPE_DN },	{ "lat", ETHERTYPE_LAT },	{ "sca", ETHERTYPE_SCA },	{ "lanbridge", ETHERTYPE_LANBRIDGE },	{ "vexp", ETHERTYPE_VEXP },	{ "vprod", ETHERTYPE_VPROD },	{ "atalk", ETHERTYPE_ATALK },	{ "atalkarp", ETHERTYPE_AARP },	{ "loopback", ETHERTYPE_LOOPBACK },	{ "decdts", ETHERTYPE_DECDTS },	{ "decdns", ETHERTYPE_DECDNS },	{ (char *)0, 0 }};intpcap_nametoeproto(const char *s){	struct eproto *p = eproto_db;	while (p->s != 0) {		if (strcmp(p->s, s) == 0)			return p->p;		p += 1;	}	return PROTO_UNDEF;}#include "llc.h"/* Static data base of LLC values. */static struct eproto llc_db[] = {	{ "iso", LLCSAP_ISONS },	{ "stp", LLCSAP_8021D },	{ "ipx", LLCSAP_IPX },	{ "netbeui", LLCSAP_NETBEUI },	{ (char *)0, 0 }};intpcap_nametollc(const char *s){	struct eproto *p = llc_db;	while (p->s != 0) {		if (strcmp(p->s, s) == 0)			return p->p;		p += 1;	}	return PROTO_UNDEF;}/* Hex digit to integer. */static inline intxdtoi(c)	register int c;{	if (isdigit(c))		return c - '0';	else if (islower(c))		return c - 'a' + 10;	else		return c - 'A' + 10;}int__pcap_atoin(const char *s, bpf_u_int32 *addr){	u_int n;	int len;	*addr = 0;	len = 0;	while (1) {		n = 0;		while (*s && *s != '.')			n = n * 10 + *s++ - '0';		*addr <<= 8;		*addr |= n & 0xff;		len += 8;		if (*s == '\0')			return len;		++s;	}	/* NOTREACHED */}int__pcap_atodn(const char *s, bpf_u_int32 *addr){#define AREASHIFT 10#define AREAMASK 0176000#define NODEMASK 01777	u_int node, area;	if (sscanf((char *)s, "%d.%d", &area, &node) != 2)		bpf_error("malformed decnet address '%s'", s);	*addr = (area << AREASHIFT) & AREAMASK;	*addr |= (node & NODEMASK);	return(32);}/* * Convert 's' which has the form "xx:xx:xx:xx:xx:xx" into a new * ethernet address.  Assumes 's' is well formed. */u_char *pcap_ether_aton(const char *s){	register u_char *ep, *e;	register u_int d;	e = ep = (u_char *)malloc(6);	while (*s) {		if (*s == ':')			s += 1;		d = xdtoi(*s++);		if (isxdigit((unsigned char)*s)) {			d <<= 4;			d |= xdtoi(*s++);		}		*ep++ = d;	}	return (e);}#ifndef HAVE_ETHER_HOSTTON/* Roll our own */u_char *pcap_ether_hostton(const char *name){	register struct pcap_etherent *ep;	register u_char *ap;	static FILE *fp = NULL;	static int init = 0;	if (!init) {		fp = fopen(PCAP_ETHERS_FILE, "r");		++init;		if (fp == NULL)			return (NULL);	} else if (fp == NULL)		return (NULL);	else		rewind(fp);	while ((ep = pcap_next_etherent(fp)) != NULL) {		if (strcmp(ep->name, name) == 0) {			ap = (u_char *)malloc(6);			if (ap != NULL) {				memcpy(ap, ep->addr, 6);				return (ap);			}			break;		}	}	return (NULL);}#else#if !defined(HAVE_DECL_ETHER_HOSTTON) || !HAVE_DECL_ETHER_HOSTTON#ifndef HAVE_STRUCT_ETHER_ADDRstruct ether_addr {	unsigned char ether_addr_octet[6];};#endifextern int ether_hostton(const char *, struct ether_addr *);#endif/* Use the os supplied routines */u_char *pcap_ether_hostton(const char *name){	register u_char *ap;	u_char a[6];	ap = NULL;	if (ether_hostton((char *)name, (struct ether_addr *)a) == 0) {		ap = (u_char *)malloc(6);		if (ap != NULL)			memcpy((char *)ap, (char *)a, 6);	}	return (ap);}#endifu_short__pcap_nametodnaddr(const char *name){#ifdef	DECNETLIB	struct nodeent *getnodebyname();	struct nodeent *nep;	unsigned short res;	nep = getnodebyname(name);	if (nep == ((struct nodeent *)0))		bpf_error("unknown decnet host name '%s'\n", name);	memcpy((char *)&res, (char *)nep->n_addr, sizeof(unsigned short));	return(res);#else	bpf_error("decnet name support not included, '%s' cannot be translated\n",		name);	return(0);#endif}

⌨️ 快捷键说明

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