diff options
-rw-r--r-- | pcap-bpf.c | 4 | ||||
-rw-r--r-- | pcap-dag.c | 25 | ||||
-rw-r--r-- | pcap-dlpi.c | 4 | ||||
-rw-r--r-- | pcap-int.h | 15 | ||||
-rw-r--r-- | pcap-linux.c | 4 | ||||
-rw-r--r-- | pcap-nit.c | 4 | ||||
-rw-r--r-- | pcap-pf.c | 4 | ||||
-rw-r--r-- | pcap-snit.c | 4 | ||||
-rw-r--r-- | pcap-snoop.c | 4 | ||||
-rw-r--r-- | pcap-win32.c | 44 | ||||
-rw-r--r-- | pcap.c | 87 | ||||
-rw-r--r-- | savefile.c | 24 |
12 files changed, 147 insertions, 76 deletions
@@ -20,7 +20,7 @@ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.68 2003-11-15 23:24:01 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-bpf.c,v 1.69 2003-11-20 02:02:38 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -763,6 +763,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_bpf; p->setfilter_op = pcap_setfilter_bpf; p->set_datalink_op = pcap_set_datalink_bpf; + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_bpf; p->close_op = pcap_close_bpf; @@ -29,7 +29,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.12 2003-11-20 01:21:26 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-dag.c,v 1.13 2003-11-20 02:02:38 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -101,6 +101,7 @@ static int dag_setfilter(pcap_t *p, struct bpf_program *fp); static int dag_stats(pcap_t *p, struct pcap_stat *ps); static int dag_set_datalink(pcap_t *p, int dlt); static int dag_get_datalink(pcap_t *p); +static int dag_setnonblock(pcap_t *p, int nonblock, char *errbuf); static void delete_pcap_dag(pcap_t *p) { pcap_dag_node_t *curr = NULL, *prev = NULL; @@ -478,6 +479,8 @@ pcap_t *dag_open_live(const char *device, int snaplen, int promisc, int to_ms, c handle->read_op = dag_read; handle->setfilter_op = dag_setfilter; handle->set_datalink_op = dag_set_datalink; + handle->getnonblock_op = pcap_getnonblock_fd; + handle->setnonblock_op = dag_setnonblock; handle->stats_op = dag_stats; handle->close_op = dag_platform_close; @@ -636,6 +639,26 @@ dag_set_datalink(pcap_t *p, int dlt) } static int +dag_setnonblock(pcap_t *p, int nonblock, char *errbuf) +{ + /* + * Set non-blocking mode on the FD. + * XXX - is that necessary? If not, don't bother calling it, + * and have a "dag_getnonblock()" function that looks at + * "p->md.dag_offset_flags". + */ + if (pcap_setnonblock_fd(p, nonblock, errbuf) < 0) + return (-1); + + if (nonblock) { + p->md.dag_offset_flags |= DAGF_NONBLOCK; + } else { + p->md.dag_offset_flags &= ~DAGF_NONBLOCK; + } + return (0); +} + +static int dag_get_datalink(pcap_t *p) { int linktype = -1; diff --git a/pcap-dlpi.c b/pcap-dlpi.c index 3500d3cb..4a9eafd4 100644 --- a/pcap-dlpi.c +++ b/pcap-dlpi.c @@ -38,7 +38,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-dlpi.c,v 1.92 2003-11-15 23:24:02 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-dlpi.c,v 1.93 2003-11-20 02:02:38 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -707,6 +707,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_dlpi; p->setfilter_op = install_bpf_program; /* no kernel filtering */ p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_dlpi; p->close_op = pcap_close_dlpi; @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.56 2003-11-20 01:21:26 guy Exp $ (LBL) + * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.57 2003-11-20 02:02:39 guy Exp $ (LBL) */ #ifndef pcap_int_h @@ -131,6 +131,8 @@ struct pcap { int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *); int (*setfilter_op)(pcap_t *, struct bpf_program *); int (*set_datalink_op)(pcap_t *, int); + int (*getnonblock_op)(pcap_t *, char *); + int (*setnonblock_op)(pcap_t *, int, char *); int (*stats_op)(pcap_t *, struct pcap_stat *); void (*close_op)(pcap_t *); @@ -235,13 +237,12 @@ int pcap_read(pcap_t *, int cnt, pcap_handler, u_char *); #endif /* - * Internal interface for "pcap_set_datalink()". Attempts to set the - * link-layer type to the specified type; if that fails, returns -1. - * (On platforms that don't support setting it at all, this can just - * return 0 - on those platforms, "pcap_set_datalink()" has already - * checked whether the DLT_ value is the one the device supports. + * Routines that most pcap implementations can use for non-blocking mode. */ -int pcap_set_datalink_platform(pcap_t *, int); +#ifndef WIN32 +int pcap_getnonblock_fd(pcap_t *, char *); +int pcap_setnonblock_fd(pcap_t *p, int, char *); +#endif /* * Internal interfaces for "pcap_findalldevs()". diff --git a/pcap-linux.c b/pcap-linux.c index 9d72313d..b59d4ed2 100644 --- a/pcap-linux.c +++ b/pcap-linux.c @@ -27,7 +27,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.100 2003-11-18 21:06:50 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-linux.c,v 1.101 2003-11-20 02:02:39 guy Exp $ (LBL)"; #endif /* @@ -400,6 +400,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, handle->read_op = pcap_read_linux; handle->setfilter_op = pcap_setfilter_linux; handle->set_datalink_op = NULL; /* can't change data link type */ + handle->getnonblock_op = pcap_getnonblock_fd; + handle->setnonblock_op = pcap_setnonblock_fd; handle->stats_op = pcap_stats_linux; handle->close_op = pcap_close_linux; @@ -20,7 +20,7 @@ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-nit.c,v 1.51 2003-11-15 23:24:03 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-nit.c,v 1.52 2003-11-20 02:02:40 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -283,6 +283,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_nit; p->setfilter_op = install_bpf_program; /* no kernel filtering */ p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_nit; p->close_op = pcap_close_nit; @@ -24,7 +24,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-pf.c,v 1.80 2003-11-15 23:24:04 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-pf.c,v 1.81 2003-11-20 02:02:40 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -437,6 +437,8 @@ your system may not be properly configured; see the packetfilter(4) man page\n", p->read_op = pcap_read_pf; p->setfilter_op = pcap_setfilter_pf; p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_pf; p->close_op = pcap_close_pf; diff --git a/pcap-snit.c b/pcap-snit.c index 635aea97..4c08b166 100644 --- a/pcap-snit.c +++ b/pcap-snit.c @@ -25,7 +25,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-snit.c,v 1.67 2003-11-15 23:24:04 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-snit.c,v 1.68 2003-11-20 02:02:40 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -341,6 +341,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_snit; p->setfilter_op = install_bpf_program; /* no kernel filtering */ p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_snit; p->close_op = pcap_close_snit; diff --git a/pcap-snoop.c b/pcap-snoop.c index 6161774c..0feaf7e4 100644 --- a/pcap-snoop.c +++ b/pcap-snoop.c @@ -20,7 +20,7 @@ */ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-snoop.c,v 1.47 2003-11-15 23:24:04 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-snoop.c,v 1.48 2003-11-20 02:02:40 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -326,6 +326,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_snoop; p->setfilter_op = install_bpf_program; /* no kernel filtering */ p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_fd; + p->setnonblock_op = pcap_setnonblock_fd; p->stats_op = pcap_stats_snoop; p->close_op = pcap_close_snoop; diff --git a/pcap-win32.c b/pcap-win32.c index bf906fb5..d44a1da6 100644 --- a/pcap-win32.c +++ b/pcap-win32.c @@ -32,7 +32,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.16 2003-11-15 23:24:05 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap-win32.c,v 1.17 2003-11-20 02:02:40 guy Exp $ (LBL)"; #endif #include <pcap-int.h> @@ -44,6 +44,8 @@ int* _errno(); #endif /* __MINGW32__ */ static int pcap_setfilter_win32(pcap_t *, struct bpf_program *); +static int pcap_getnonblock_win32(pcap_t *, char *); +static int pcap_setnonblock_win32(pcap_t *, int, char *); #define PcapBufSize 256000 /*dimension of the buffer in the pcap_t structure*/ #define SIZE_BUF 1000000 @@ -286,6 +288,8 @@ pcap_open_live(const char *device, int snaplen, int promisc, int to_ms, p->read_op = pcap_read_win32; p->setfilter_op = pcap_setfilter_win32; p->set_datalink_op = NULL; /* can't change data link type */ + p->getnonblock_op = pcap_getnonblock_win32; + p->setnonblock_op = pcap_setnonblock_win32; p->stats_op = pcap_stats_win32; p->close_op = pcap_close_win32; @@ -312,6 +316,44 @@ pcap_setfilter_win32(pcap_t *p, struct bpf_program *fp) } +static int +pcap_getnonblock_win32(pcap_t *p, char *errbuf) +{ + /* + * XXX - if there were a PacketGetReadTimeout() call, we + * would use it, and return 1 if the timeout is -1 + * and 0 otherwise. + */ + return (p->nonblock); +} + +static int +pcap_setnonblock_win32(pcap_t *p, int nonblock, char *errbuf) +{ + int newtimeout; + + if (nonblock) { + /* + * Set the read timeout to -1 for non-blocking mode. + */ + newtimeout = -1; + } else { + /* + * Restore the timeout set when the device was opened. + * (Note that this may be -1, in which case we're not + * really leaving non-blocking mode.) + */ + newtimeout = p->timeout; + } + if (!PacketSetReadTimeout(p->adapter, newtimeout)) { + snprintf(p->errbuf, PCAP_ERRBUF_SIZE, + "PacketSetReadTimeout: %s", pcap_win32strerror()); + return (-1); + } + p->nonblock = (newtimeout == -1); + return (0); +} + /* Set the driver working mode */ int pcap_setmode(pcap_t *p, int mode){ @@ -33,7 +33,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.67 2003-11-20 01:21:26 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/pcap.c,v 1.68 2003-11-20 02:02:41 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -512,26 +512,25 @@ pcap_geterr(pcap_t *p) return (p->errbuf); } -/* - * NOTE: in the future, these may need to call platform-dependent routines, - * e.g. on platforms with memory-mapped packet-capture mechanisms where - * "pcap_read()" uses "select()" or "poll()" to wait for packets to arrive. - */ int pcap_getnonblock(pcap_t *p, char *errbuf) { + return p->getnonblock_op(p, errbuf); +} + +/* + * Get the current non-blocking mode setting, under the assumption that + * it's just the standard POSIX non-blocking flag. + * + * We don't look at "p->nonblock", in case somebody tweaked the FD + * directly. + */ #ifndef WIN32 +int +pcap_getnonblock_fd(pcap_t *p, char *errbuf) +{ int fdflags; -#endif - if (p->sf.rfile != NULL) { - /* - * This is a savefile, not a live capture file, so - * never say it's in non-blocking mode. - */ - return (0); - } -#ifndef WIN32 fdflags = fcntl(p->fd, F_GETFL, 0); if (fdflags == -1) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s", @@ -542,37 +541,27 @@ pcap_getnonblock(pcap_t *p, char *errbuf) return (1); else return (0); -#else - return (p->nonblock); -#endif } +#endif int pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf) { + return p->setnonblock_op(p, nonblock, errbuf); +} + #ifndef WIN32 +/* + * Set non-blocking mode, under the assumption that it's just the + * standard POSIX non-blocking flag. (This can be called by the + * per-platform non-blocking-mode routine if that routine also + * needs to do some additional work.) + */ +int +pcap_setnonblock_fd(pcap_t *p, int nonblock, char *errbuf) +{ int fdflags; -#else - int newtimeout; -#endif - - if (p->sf.rfile != NULL) { - /* - * This is a savefile, not a live capture file, so - * ignore requests to put it in non-blocking mode. - */ - return (0); - } - -#if HAVE_DAG_API - if (nonblock) { - p->md.dag_offset_flags |= DAGF_NONBLOCK; - } else { - p->md.dag_offset_flags &= ~DAGF_NONBLOCK; - } -#endif /* HAVE_DAG_API */ -#ifndef WIN32 fdflags = fcntl(p->fd, F_GETFL, 0); if (fdflags == -1) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, "F_GETFL: %s", @@ -588,29 +577,9 @@ pcap_setnonblock(pcap_t *p, int nonblock, char *errbuf) pcap_strerror(errno)); return (-1); } -#else - if (nonblock) { - /* - * Set the read timeout to -1 for non-blocking mode. - */ - newtimeout = -1; - } else { - /* - * Restore the timeout set when the device was opened. - * (Note that this may be -1, in which case we're not - * really leaving non-blocking mode.) - */ - newtimeout = p->timeout; - } - if (!PacketSetReadTimeout(p->adapter, newtimeout)) { - snprintf(p->errbuf, PCAP_ERRBUF_SIZE, - "PacketSetReadTimeout: %s", pcap_win32strerror()); - return (-1); - } - p->nonblock = (newtimeout == -1); -#endif return (0); } +#endif #ifdef WIN32 /* @@ -30,7 +30,7 @@ #ifndef lint static const char rcsid[] _U_ = - "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.96 2003-11-18 21:06:51 guy Exp $ (LBL)"; + "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.97 2003-11-20 02:02:41 guy Exp $ (LBL)"; #endif #ifdef HAVE_CONFIG_H @@ -429,6 +429,26 @@ swap_hdr(struct pcap_file_header *hp) } static int +sf_getnonblock(pcap_t *p, char *errbuf) +{ + /* + * This is a savefile, not a live capture file, so never say + * it's in non-blocking mode. + */ + return (0); +} + +static int +sf_setnonblock(pcap_t *p, int nonblock, char *errbuf) +{ + /* + * This is a savefile, not a live capture file, so ignore + * requests to put it in non-blocking mode. + */ + return (0); +} + +static int sf_stats(pcap_t *p, struct pcap_stat *ps) { snprintf(p->errbuf, PCAP_ERRBUF_SIZE, @@ -583,6 +603,8 @@ pcap_open_offline(const char *fname, char *errbuf) p->read_op = pcap_offline_read; p->setfilter_op = install_bpf_program; p->set_datalink_op = NULL; /* we don't support munging link-layer headers */ + p->getnonblock_op = sf_getnonblock; + p->setnonblock_op = sf_setnonblock; p->stats_op = sf_stats; p->close_op = sf_close; |