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

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1990, 1993, 1994, 1995, 1996
  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. #ifndef lint
  22. static const char rcsid[] =
  23.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/etherent.c,v 1.3 2003/02/06 20:28:07 renaud Exp $ (LBL)";
  24. #endif
  25. #include <sys/types.h>
  26. #include <ctype.h>
  27. #include <memory.h>
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include "pcap-int.h"
  31. #include "pcap-namedb.h"
  32. #include "gnuc.h"
  33. #ifdef HAVE_OS_PROTO_H
  34. #include "os-proto.h"
  35. #endif
  36. static inline int xdtoi(int);
  37. static inline int skip_space(FILE *);
  38. static inline int skip_line(FILE *);
  39. /* Hex digit to integer. */
  40. static inline int
  41. xdtoi(c)
  42. register int c;
  43. {
  44. if (isdigit(c))
  45. return c - '0';
  46. else if (islower(c))
  47. return c - 'a' + 10;
  48. else
  49. return c - 'A' + 10;
  50. }
  51. static inline int
  52. skip_space(f)
  53. FILE *f;
  54. {
  55. int c;
  56. do {
  57. c = getc(f);
  58. } while (isspace(c) && c != 'n');
  59. return c;
  60. }
  61. static inline int
  62. skip_line(f)
  63. FILE *f;
  64. {
  65. int c;
  66. do
  67. c = getc(f);
  68. while (c != 'n' && c != EOF);
  69. return c;
  70. }
  71. struct pcap_etherent *
  72. pcap_next_etherent(FILE *fp)
  73. {
  74. register int c, d, i;
  75. char *bp;
  76. static struct pcap_etherent e;
  77. memset((char *)&e, 0, sizeof(e));
  78. do {
  79. /* Find addr */
  80. c = skip_space(fp);
  81. if (c == 'n')
  82. continue;
  83. /* If this is a comment, or first thing on line
  84.    cannot be etehrnet address, skip the line. */
  85. if (!isxdigit(c)) {
  86. c = skip_line(fp);
  87. continue;
  88. }
  89. /* must be the start of an address */
  90. for (i = 0; i < 6; i += 1) {
  91. d = xdtoi(c);
  92. c = getc(fp);
  93. if (isxdigit(c)) {
  94. d <<= 4;
  95. d |= xdtoi(c);
  96. c = getc(fp);
  97. }
  98. e.addr[i] = d;
  99. if (c != ':')
  100. break;
  101. c = getc(fp);
  102. }
  103. if (c == EOF)
  104. break;
  105. /* Must be whitespace */
  106. if (!isspace(c)) {
  107. c = skip_line(fp);
  108. continue;
  109. }
  110. c = skip_space(fp);
  111. /* hit end of line... */
  112. if (c == 'n')
  113. continue;
  114. if (c == '#') {
  115. c = skip_line(fp);
  116. continue;
  117. }
  118. /* pick up name */
  119. bp = e.name;
  120. /* Use 'd' to prevent buffer overflow. */
  121. d = sizeof(e.name) - 1;
  122. do {
  123. *bp++ = c;
  124. c = getc(fp);
  125. } while (!isspace(c) && c != EOF && --d > 0);
  126. *bp = '';
  127. /* Eat trailing junk */
  128. if (c != 'n')
  129. (void)skip_line(fp);
  130. return &e;
  131. } while (c != EOF);
  132. return (NULL);
  133. }