etherent.c
上传用户:tjescc
上传日期:2021-02-23
资源大小:419k
文件大小:3k
- /*
- * Copyright (c) 1990, 1993, 1994, 1995, 1996
- * 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.
- */
- #ifndef lint
- static const char rcsid[] =
- "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/etherent.c,v 1.3 2003/02/06 20:28:07 renaud Exp $ (LBL)";
- #endif
- #include <sys/types.h>
- #include <ctype.h>
- #include <memory.h>
- #include <stdio.h>
- #include <string.h>
- #include "pcap-int.h"
- #include "pcap-namedb.h"
- #include "gnuc.h"
- #ifdef HAVE_OS_PROTO_H
- #include "os-proto.h"
- #endif
- static inline int xdtoi(int);
- static inline int skip_space(FILE *);
- static inline int skip_line(FILE *);
- /* Hex digit to integer. */
- static inline int
- xdtoi(c)
- register int c;
- {
- if (isdigit(c))
- return c - '0';
- else if (islower(c))
- return c - 'a' + 10;
- else
- return c - 'A' + 10;
- }
- static inline int
- skip_space(f)
- FILE *f;
- {
- int c;
- do {
- c = getc(f);
- } while (isspace(c) && c != 'n');
- return c;
- }
- static inline int
- skip_line(f)
- FILE *f;
- {
- int c;
- do
- c = getc(f);
- while (c != 'n' && c != EOF);
- return c;
- }
- struct pcap_etherent *
- pcap_next_etherent(FILE *fp)
- {
- register int c, d, i;
- char *bp;
- static struct pcap_etherent e;
- memset((char *)&e, 0, sizeof(e));
- do {
- /* Find addr */
- c = skip_space(fp);
- if (c == 'n')
- continue;
- /* If this is a comment, or first thing on line
- cannot be etehrnet address, skip the line. */
- if (!isxdigit(c)) {
- c = skip_line(fp);
- continue;
- }
- /* must be the start of an address */
- for (i = 0; i < 6; i += 1) {
- d = xdtoi(c);
- c = getc(fp);
- if (isxdigit(c)) {
- d <<= 4;
- d |= xdtoi(c);
- c = getc(fp);
- }
- e.addr[i] = d;
- if (c != ':')
- break;
- c = getc(fp);
- }
- if (c == EOF)
- break;
- /* Must be whitespace */
- if (!isspace(c)) {
- c = skip_line(fp);
- continue;
- }
- c = skip_space(fp);
- /* hit end of line... */
- if (c == 'n')
- continue;
- if (c == '#') {
- c = skip_line(fp);
- continue;
- }
- /* pick up name */
- bp = e.name;
- /* Use 'd' to prevent buffer overflow. */
- d = sizeof(e.name) - 1;
- do {
- *bp++ = c;
- c = getc(fp);
- } while (!isspace(c) && c != EOF && --d > 0);
- *bp = ' ';
- /* Eat trailing junk */
- if (c != 'n')
- (void)skip_line(fp);
- return &e;
- } while (c != EOF);
- return (NULL);
- }