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

Telnet服务器

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 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 the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  * This product includes software developed by the Computer Systems
  16.  * Engineering Group at Lawrence Berkeley Laboratory.
  17.  * 4. Neither the name of the University nor of the Laboratory may be used
  18.  *    to endorse or promote products derived from this software without
  19.  *    specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33. #ifndef lint
  34. static const char rcsid[] =
  35.     "@(#) $Header: /usr/local/cvs/nessus-libraries/libpcap-nessus/pcap.c,v 1.3 2003/02/06 20:28:09 renaud Exp $ (LBL)";
  36. #endif
  37. #include <sys/types.h>
  38. #include <stdio.h>
  39. #include <stdlib.h>
  40. #include <string.h>
  41. #include <unistd.h>
  42. #include "gnuc.h"
  43. #ifdef HAVE_OS_PROTO_H
  44. #include "os-proto.h"
  45. #endif
  46. #include "pcap-int.h"
  47. int
  48. pcap_dispatch(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
  49. {
  50. if (p->sf.rfile != NULL)
  51. return (pcap_offline_read(p, cnt, callback, user));
  52. return (pcap_read(p, cnt, callback, user));
  53. }
  54. int
  55. pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)
  56. {
  57. register int n;
  58. for (;;) {
  59. if (p->sf.rfile != NULL)
  60. n = pcap_offline_read(p, cnt, callback, user);
  61. else {
  62. /*
  63.  * XXX keep reading until we get something
  64.  * (or an error occurs)
  65.  */
  66. do {
  67. n = pcap_read(p, cnt, callback, user);
  68. } while (n == 0);
  69. }
  70. if (n <= 0)
  71. return (n);
  72. if (cnt > 0) {
  73. cnt -= n;
  74. if (cnt <= 0)
  75. return (0);
  76. }
  77. }
  78. }
  79. struct singleton {
  80. struct pcap_pkthdr *hdr;
  81. const u_char *pkt;
  82. };
  83. static void
  84. pcap_oneshot(u_char *userData, const struct pcap_pkthdr *h, const u_char *pkt)
  85. {
  86. struct singleton *sp = (struct singleton *)userData;
  87. *sp->hdr = *h;
  88. sp->pkt = pkt;
  89. }
  90. const u_char *
  91. pcap_next(pcap_t *p, struct pcap_pkthdr *h)
  92. {
  93. struct singleton s;
  94. s.hdr = h;
  95. if (pcap_dispatch(p, 1, pcap_oneshot, (u_char*)&s) <= 0)
  96. return (0);
  97. return (s.pkt);
  98. }
  99. int
  100. pcap_datalink(pcap_t *p)
  101. {
  102. return (p->linktype);
  103. }
  104. int
  105. pcap_snapshot(pcap_t *p)
  106. {
  107. return (p->snapshot);
  108. }
  109. int
  110. pcap_is_swapped(pcap_t *p)
  111. {
  112. return (p->sf.swapped);
  113. }
  114. int
  115. pcap_major_version(pcap_t *p)
  116. {
  117. return (p->sf.version_major);
  118. }
  119. int
  120. pcap_minor_version(pcap_t *p)
  121. {
  122. return (p->sf.version_minor);
  123. }
  124. FILE *
  125. pcap_file(pcap_t *p)
  126. {
  127. return (p->sf.rfile);
  128. }
  129. int
  130. pcap_fileno(pcap_t *p)
  131. {
  132. return (p->fd);
  133. }
  134. void
  135. pcap_perror(pcap_t *p, char *prefix)
  136. {
  137. fprintf(stderr, "%s: %sn", prefix, p->errbuf);
  138. }
  139. char *
  140. pcap_geterr(pcap_t *p)
  141. {
  142. return (p->errbuf);
  143. }
  144. /*
  145.  * Not all systems have strerror().
  146.  */
  147. char *
  148. pcap_strerror(int errnum)
  149. {
  150. #ifdef HAVE_STRERROR
  151. return (strerror(errnum));
  152. #else
  153. extern int sys_nerr;
  154. extern const char *const sys_errlist[];
  155. static char ebuf[20];
  156. if ((unsigned int)errnum < sys_nerr)
  157. return ((char *)sys_errlist[errnum]);
  158. (void)sprintf(ebuf, "Unknown error: %d", errnum);
  159. return(ebuf);
  160. #endif
  161. }
  162. void
  163. pcap_close(pcap_t *p)
  164. {
  165. /*XXX*/
  166. if (p->fd >= 0)
  167. close(p->fd);
  168. if (p->sf.rfile != NULL) {
  169. (void)fclose(p->sf.rfile);
  170. if (p->sf.base != NULL)
  171. free(p->sf.base);
  172. } else if (p->buffer != NULL)
  173. free(p->buffer);
  174. #ifdef linux
  175. if (p->md.device != NULL)
  176. free(p->md.device);
  177. #endif
  178. free(p);
  179. }