nametoaddr.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:8k
源码类别:

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998
  3.  * The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * Name to id translation routines used by the scanner.
  22.  * These functions are not time critical.
  23.  */
  24. #ifndef lint
  25. static const char rcsid[] =
  26.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/nametoaddr.c,v 1.3 2003/02/06 20:28:08 renaud Exp $ (LBL)";
  27. #endif
  28. #include <sys/param.h>
  29. #include <sys/types.h> /* concession to AIX */
  30. #include <sys/socket.h>
  31. #include <sys/time.h>
  32. #if __STDC__
  33. struct mbuf;
  34. struct rtentry;
  35. #endif
  36. #include <net/if.h>
  37. #include <netinet/in.h>
  38. #include <netinet/if_ether.h>
  39. #include <arpa/inet.h>
  40. #include <ctype.h>
  41. #include <errno.h>
  42. #include <stdlib.h>
  43. #include <memory.h>
  44. #include <netdb.h>
  45. #include <stdio.h>
  46. #include "pcap-int.h"
  47. #include "gencode.h"
  48. #include "pcap-namedb.h"
  49. #include "gnuc.h"
  50. #ifdef HAVE_OS_PROTO_H
  51. #include "os-proto.h"
  52. #endif
  53. #ifndef NTOHL
  54. #define NTOHL(x) (x) = ntohl(x)
  55. #define NTOHS(x) (x) = ntohs(x)
  56. #endif
  57. static inline int xdtoi(int);
  58. /*
  59.  *  Convert host name to internet address.
  60.  *  Return 0 upon failure.
  61.  */
  62. bpf_u_int32 **
  63. pcap_nametoaddr(const char *name)
  64. {
  65. #ifndef h_addr
  66. static bpf_u_int32 *hlist[2];
  67. #endif
  68. bpf_u_int32 **p;
  69. struct hostent *hp;
  70. if ((hp = gethostbyname(name)) != NULL) {
  71. #ifndef h_addr
  72. hlist[0] = (bpf_u_int32 *)hp->h_addr;
  73. NTOHL(hp->h_addr);
  74. return hlist;
  75. #else
  76. for (p = (bpf_u_int32 **)hp->h_addr_list; *p; ++p)
  77. NTOHL(**p);
  78. return (bpf_u_int32 **)hp->h_addr_list;
  79. #endif
  80. }
  81. else
  82. return 0;
  83. }
  84. /*
  85.  *  Convert net name to internet address.
  86.  *  Return 0 upon failure.
  87.  */
  88. bpf_u_int32
  89. pcap_nametonetaddr(const char *name)
  90. {
  91. struct netent *np;
  92. if ((np = getnetbyname(name)) != NULL)
  93. return np->n_net;
  94. else
  95. return 0;
  96. }
  97. /*
  98.  * Convert a port name to its port and protocol numbers.
  99.  * We assume only TCP or UDP.
  100.  * Return 0 upon failure.
  101.  */
  102. int
  103. pcap_nametoport(const char *name, int *port, int *proto)
  104. {
  105. struct servent *sp;
  106. char *other;
  107. sp = getservbyname(name, (char *)0);
  108. if (sp != NULL) {
  109. NTOHS(sp->s_port);
  110. *port = sp->s_port;
  111. *proto = pcap_nametoproto(sp->s_proto);
  112. /*
  113.  * We need to check /etc/services for ambiguous entries.
  114.  * If we find the ambiguous entry, and it has the
  115.  * same port number, change the proto to PROTO_UNDEF
  116.  * so both TCP and UDP will be checked.
  117.  */
  118. if (*proto == IPPROTO_TCP)
  119. other = "udp";
  120. else
  121. other = "tcp";
  122. sp = getservbyname(name, other);
  123. if (sp != 0) {
  124. NTOHS(sp->s_port);
  125. #ifdef notdef
  126. if (*port != sp->s_port)
  127. /* Can't handle ambiguous names that refer
  128.    to different port numbers. */
  129. warning("ambiguous port %s in /etc/services",
  130. name);
  131. #endif
  132. *proto = PROTO_UNDEF;
  133. }
  134. return 1;
  135. }
  136. #if defined(ultrix) || defined(__osf__)
  137. /* Special hack in case NFS isn't in /etc/services */
  138. if (strcmp(name, "nfs") == 0) {
  139. *port = 2049;
  140. *proto = PROTO_UNDEF;
  141. return 1;
  142. }
  143. #endif
  144. return 0;
  145. }
  146. int
  147. pcap_nametoproto(const char *str)
  148. {
  149. struct protoent *p;
  150. p = getprotobyname(str);
  151. if (p != 0)
  152. return p->p_proto;
  153. else
  154. return PROTO_UNDEF;
  155. }
  156. #include "ethertype.h"
  157. struct eproto {
  158. char *s;
  159. u_short p;
  160. };
  161. /* Static data base of ether protocol types. */
  162. struct eproto eproto_db[] = {
  163. { "pup", ETHERTYPE_PUP },
  164. { "xns", ETHERTYPE_NS },
  165. { "ip", ETHERTYPE_IP },
  166. { "arp", ETHERTYPE_ARP },
  167. { "rarp", ETHERTYPE_REVARP },
  168. { "sprite", ETHERTYPE_SPRITE },
  169. { "mopdl", ETHERTYPE_MOPDL },
  170. { "moprc", ETHERTYPE_MOPRC },
  171. { "decnet", ETHERTYPE_DN },
  172. { "lat", ETHERTYPE_LAT },
  173. { "sca", ETHERTYPE_SCA },
  174. { "lanbridge", ETHERTYPE_LANBRIDGE },
  175. { "vexp", ETHERTYPE_VEXP },
  176. { "vprod", ETHERTYPE_VPROD },
  177. { "atalk", ETHERTYPE_ATALK },
  178. { "atalkarp", ETHERTYPE_AARP },
  179. { "loopback", ETHERTYPE_LOOPBACK },
  180. { "decdts", ETHERTYPE_DECDTS },
  181. { "decdns", ETHERTYPE_DECDNS },
  182. { (char *)0, 0 }
  183. };
  184. int
  185. pcap_nametoeproto(const char *s)
  186. {
  187. struct eproto *p = eproto_db;
  188. while (p->s != 0) {
  189. if (strcmp(p->s, s) == 0)
  190. return p->p;
  191. p += 1;
  192. }
  193. return PROTO_UNDEF;
  194. }
  195. /* Hex digit to integer. */
  196. static inline int
  197. xdtoi(c)
  198. register int c;
  199. {
  200. if (isdigit(c))
  201. return c - '0';
  202. else if (islower(c))
  203. return c - 'a' + 10;
  204. else
  205. return c - 'A' + 10;
  206. }
  207. int
  208. __pcap_atoin(const char *s, bpf_u_int32 *addr)
  209. {
  210. u_int n;
  211. int len;
  212. *addr = 0;
  213. len = 0;
  214. while (1) {
  215. n = 0;
  216. while (*s && *s != '.')
  217. n = n * 10 + *s++ - '0';
  218. *addr <<= 8;
  219. *addr |= n & 0xff;
  220. len += 8;
  221. if (*s == '')
  222. return len;
  223. ++s;
  224. }
  225. /* NOTREACHED */
  226. }
  227. int
  228. __pcap_atodn(const char *s, bpf_u_int32 *addr)
  229. {
  230. #define AREASHIFT 10
  231. #define AREAMASK 0176000
  232. #define NODEMASK 01777
  233. u_int node, area;
  234. if (sscanf((char *)s, "%d.%d", &area, &node) != 2)
  235. bpf_error("malformed decnet address '%s'", s);
  236. *addr = (area << AREASHIFT) & AREAMASK;
  237. *addr |= (node & NODEMASK);
  238. return(32);
  239. }
  240. /*
  241.  * Convert 's' which has the form "xx:xx:xx:xx:xx:xx" into a new
  242.  * ethernet address.  Assumes 's' is well formed.
  243.  */
  244. u_char *
  245. pcap_ether_aton(const char *s)
  246. {
  247. register u_char *ep, *e;
  248. register u_int d;
  249. e = ep = (u_char *)malloc(6);
  250. while (*s) {
  251. if (*s == ':')
  252. s += 1;
  253. d = xdtoi(*s++);
  254. if (isxdigit(*s)) {
  255. d <<= 4;
  256. d |= xdtoi(*s++);
  257. }
  258. *ep++ = d;
  259. }
  260. return (e);
  261. }
  262. #ifndef HAVE_ETHER_HOSTTON
  263. /* Roll our own */
  264. u_char *
  265. pcap_ether_hostton(const char *name)
  266. {
  267. register struct pcap_etherent *ep;
  268. register u_char *ap;
  269. static FILE *fp = NULL;
  270. static init = 0;
  271. if (!init) {
  272. fp = fopen(PCAP_ETHERS_FILE, "r");
  273. ++init;
  274. if (fp == NULL)
  275. return (NULL);
  276. } else if (fp == NULL)
  277. return (NULL);
  278. else
  279. rewind(fp);
  280. while ((ep = pcap_next_etherent(fp)) != NULL) {
  281. if (strcmp(ep->name, name) == 0) {
  282. ap = (u_char *)malloc(6);
  283. if (ap != NULL) {
  284. memcpy(ap, ep->addr, 6);
  285. return (ap);
  286. }
  287. break;
  288. }
  289. }
  290. return (NULL);
  291. }
  292. #else
  293. /* --CHANGE BY FYODOR@DHP.COM .  IT IS APPARENTLY NECESSARY TO COMMENT
  294.    THIS OUT FOR COMPILING ON NETBSD */
  295. /*
  296. #ifndef sgi
  297. extern int ether_hostton(char *, struct ether_addr *);
  298. #endif
  299. */
  300. /* Use the os supplied routines */
  301. u_char *
  302. pcap_ether_hostton(const char *name)
  303. {
  304. register u_char *ap;
  305. u_char a[6];
  306. ap = NULL;
  307. if (ether_hostton((char *)name, (struct ether_addr *)a) == 0) {
  308. ap = (u_char *)malloc(6);
  309. if (ap != NULL)
  310. memcpy((char *)ap, (char *)a, 6);
  311. }
  312. return (ap);
  313. }
  314. #endif
  315. u_short
  316. __pcap_nametodnaddr(const char *name)
  317. {
  318. #ifdef DECNETLIB
  319. struct nodeent *getnodebyname();
  320. struct nodeent *nep;
  321. unsigned short res;
  322. nep = getnodebyname(name);
  323. if (nep == ((struct nodeent *)0))
  324. bpf_error("unknown decnet host name '%s'n", name);
  325. memcpy((char *)&res, (char *)nep->n_addr, sizeof(unsigned short));
  326. return(res);
  327. #else
  328. bpf_error("decnet name support not included, '%s' cannot be translatedn",
  329. name);
  330. #endif
  331. }