Work around WinPcap bug wherein pcap_open() returns -1 without putting
[metze/wireshark/wip.git] / dumpcap.c
1 /* dumpcap.c
2  *
3  * $Id$
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  */
23
24 #ifdef HAVE_CONFIG_H
25 # include "config.h"
26 #endif
27
28 #include <stdio.h>
29 #include <stdlib.h> /* for exit() */
30 #include <glib.h>
31
32 #include <string.h>
33 #include <ctype.h>
34
35 #ifdef HAVE_SYS_TYPES_H
36 # include <sys/types.h>
37 #endif
38
39 #ifdef HAVE_SYS_STAT_H
40 # include <sys/stat.h>
41 #endif
42
43 #ifdef HAVE_FCNTL_H
44 #include <fcntl.h>
45 #endif
46
47 #ifdef HAVE_UNISTD_H
48 #include <unistd.h>
49 #endif
50
51 #ifdef HAVE_ARPA_INET_H
52 #include <arpa/inet.h>
53 #endif
54
55 #if defined(__APPLE__) && defined(__LP64__)
56 #include <sys/utsname.h>
57 #endif
58
59 #include <signal.h>
60 #include <errno.h>
61
62 #ifndef HAVE_GETOPT
63 #include "wsutil/wsgetopt.h"
64 #endif
65
66 #ifdef HAVE_NETDB_H
67 #include <netdb.h>
68 #endif
69
70 #ifdef HAVE_LIBCAP
71 # include <sys/prctl.h>
72 # include <sys/capability.h>
73 #endif
74
75 #include "ringbuffer.h"
76 #include "clopts_common.h"
77 #include "console_io.h"
78 #include "cmdarg_err.h"
79 #include "version_info.h"
80
81 #include "capture-pcap-util.h"
82 #ifdef _WIN32
83 #include "capture-wpcap.h"
84 #endif /* _WIN32 */
85
86 #include "pcapio.h"
87
88 #ifdef _WIN32
89 #include "capture-wpcap.h"
90 #include <wsutil/unicode-utils.h>
91 #endif
92
93 #ifndef _WIN32
94 #include <sys/socket.h>
95 #include <sys/un.h>
96 #endif
97
98 #ifdef NEED_INET_V6DEFS_H
99 # include "wsutil/inet_v6defs.h"
100 #endif
101
102 #include <wsutil/privileges.h>
103
104 #include "sync_pipe.h"
105
106 #include "capture_opts.h"
107 #include "capture_ifinfo.h"
108 #include "capture_sync.h"
109
110 #include "conditions.h"
111 #include "capture_stop_conditions.h"
112
113 #include "tempfile.h"
114 #include "log.h"
115 #include "wsutil/file_util.h"
116
117 /*
118  * Get information about libpcap format from "wiretap/libpcap.h".
119  * XXX - can we just use pcap_open_offline() to read the pipe?
120  */
121 #include "wiretap/libpcap.h"
122
123 /**#define DEBUG_DUMPCAP**/
124 /**#define DEBUG_CHILD_DUMPCAP**/
125
126 #ifdef _WIN32
127 #ifdef DEBUG_DUMPCAP
128 #include <conio.h>          /* _getch() */
129 #endif
130 #endif
131
132 #ifdef DEBUG_CHILD_DUMPCAP
133 FILE *debug_log;   /* for logging debug messages to  */
134                    /*  a file if DEBUG_CHILD_DUMPCAP */
135                    /*  is defined                    */
136 #endif
137
138 static GAsyncQueue *pcap_queue;
139 static gint64 pcap_queue_bytes;
140 static gint64 pcap_queue_packets;
141 static gint64 pcap_queue_byte_limit = 1024 * 1024;
142 static gint64 pcap_queue_packet_limit = 1000;
143
144 static gboolean capture_child = FALSE; /* FALSE: standalone call, TRUE: this is an Wireshark capture child */
145 #ifdef _WIN32
146 static gchar *sig_pipe_name = NULL;
147 static HANDLE sig_pipe_handle = NULL;
148 static gboolean signal_pipe_check_running(void);
149 #endif
150
151 #ifdef SIGINFO
152 static gboolean infodelay;      /* if TRUE, don't print capture info in SIGINFO handler */
153 static gboolean infoprint;      /* if TRUE, print capture info after clearing infodelay */
154 #endif /* SIGINFO */
155
156 /** Stop a low-level capture (stops the capture child). */
157 static void capture_loop_stop(void);
158
159 #if !defined (__linux__)
160 #ifndef HAVE_PCAP_BREAKLOOP
161 /*
162  * We don't have pcap_breakloop(), which is the only way to ensure that
163  * pcap_dispatch(), pcap_loop(), or even pcap_next() or pcap_next_ex()
164  * won't, if the call to read the next packet or batch of packets is
165  * is interrupted by a signal on UN*X, just go back and try again to
166  * read again.
167  *
168  * On UN*X, we catch SIGINT as a "stop capturing" signal, and, in
169  * the signal handler, set a flag to stop capturing; however, without
170  * a guarantee of that sort, we can't guarantee that we'll stop capturing
171  * if the read will be retried and won't time out if no packets arrive.
172  *
173  * Therefore, on at least some platforms, we work around the lack of
174  * pcap_breakloop() by doing a select() on the pcap_t's file descriptor
175  * to wait for packets to arrive, so that we're probably going to be
176  * blocked in the select() when the signal arrives, and can just bail
177  * out of the loop at that point.
178  *
179  * However, we don't want to do that on BSD (because "select()" doesn't work
180  * correctly on BPF devices on at least some releases of some flavors of
181  * BSD), and we don't want to do it on Windows (because "select()" is
182  * something for sockets, not for arbitrary handles).  (Note that "Windows"
183  * here includes Cygwin; even in its pretend-it's-UNIX environment, we're
184  * using WinPcap, not a UNIX libpcap.)
185  *
186  * Fortunately, we don't need to do it on BSD, because the libpcap timeout
187  * on BSD times out even if no packets have arrived, so we'll eventually
188  * exit pcap_dispatch() with an indication that no packets have arrived,
189  * and will break out of the capture loop at that point.
190  *
191  * On Windows, we can't send a SIGINT to stop capturing, so none of this
192  * applies in any case.
193  *
194  * XXX - the various BSDs appear to define BSD in <sys/param.h>; we don't
195  * want to include it if it's not present on this platform, however.
196  */
197 # if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && \
198     !defined(__bsdi__) && !defined(__APPLE__) && !defined(_WIN32) && \
199     !defined(__CYGWIN__)
200 #  define MUST_DO_SELECT
201 # endif /* avoid select */
202 #endif /* HAVE_PCAP_BREAKLOOP */
203 #else /* linux */
204 /* whatever the deal with pcap_breakloop, linux doesn't support timeouts
205  * in pcap_dispatch(); on the other hand, select() works just fine there.
206  * Hence we use a select for that come what may.
207  */
208 #define MUST_DO_SELECT
209 #endif
210
211 /** init the capture filter */
212 typedef enum {
213     INITFILTER_NO_ERROR,
214     INITFILTER_BAD_FILTER,
215     INITFILTER_OTHER_ERROR
216 } initfilter_status_t;
217
218 typedef struct _pcap_options {
219     guint32        received;
220     guint32        dropped;
221     pcap_t         *pcap_h;
222 #ifdef MUST_DO_SELECT
223     int            pcap_fd;               /* pcap file descriptor */
224 #endif
225     gboolean       pcap_err;
226     guint          interface_id;
227     GThread        *tid;
228     int            snaplen;
229     int            linktype;
230     gboolean       ts_nsec;               /* TRUE if we're using nanosecond precision. */
231     /* capture pipe (unix only "input file") */
232     gboolean       from_cap_pipe;         /* TRUE if we are capturing data from a capture pipe */
233     struct pcap_hdr cap_pipe_hdr;         /* Pcap header when capturing from a pipe */
234     struct pcaprec_modified_hdr cap_pipe_rechdr;  /* Pcap record header when capturing from a pipe */
235 #ifdef _WIN32
236     HANDLE         cap_pipe_h;            /* The handle of the capture pipe */
237 #else
238     int            cap_pipe_fd;           /* the file descriptor of the capture pipe */
239 #endif
240     gboolean       cap_pipe_modified;     /* TRUE if data in the pipe uses modified pcap headers */
241     gboolean       cap_pipe_byte_swapped; /* TRUE if data in the pipe is byte swapped */
242 #if defined(_WIN32)
243     char *         cap_pipe_buf;          /* Pointer to the data buffer we read into */
244 #endif
245     int            cap_pipe_bytes_to_read;/* Used by cap_pipe_dispatch */
246     int            cap_pipe_bytes_read;   /* Used by cap_pipe_dispatch */
247     enum {
248         STATE_EXPECT_REC_HDR,
249         STATE_READ_REC_HDR,
250         STATE_EXPECT_DATA,
251         STATE_READ_DATA
252     } cap_pipe_state;
253     enum { PIPOK, PIPEOF, PIPERR, PIPNEXIST } cap_pipe_err;
254 #if defined(_WIN32)
255     GMutex *cap_pipe_read_mtx;
256     GAsyncQueue *cap_pipe_pending_q, *cap_pipe_done_q;
257 #endif
258 } pcap_options;
259
260 typedef struct _loop_data {
261     /* common */
262     gboolean       go;                    /* TRUE as long as we're supposed to keep capturing */
263     int            err;                   /* if non-zero, error seen while capturing */
264     gint           packet_count;          /* Number of packets we have already captured */
265     gint           packet_max;            /* Number of packets we're supposed to capture - 0 means infinite */
266     gint           inpkts_to_sync_pipe;   /* Packets not already send out to the sync_pipe */
267 #ifdef SIGINFO
268     gboolean       report_packet_count;   /* Set by SIGINFO handler; print packet count */
269 #endif
270     GArray         *pcaps;
271     /* output file(s) */
272     FILE          *pdh;
273     int            save_file_fd;
274     long           bytes_written;
275     guint32        autostop_files;
276 } loop_data;
277
278 typedef struct _pcap_queue_element {
279     pcap_options       *pcap_opts;
280     struct pcap_pkthdr phdr;
281     u_char             *pd;
282 } pcap_queue_element;
283
284 /*
285  * Standard secondary message for unexpected errors.
286  */
287 static const char please_report[] =
288     "Please report this to the Wireshark developers.\n"
289     "(This is not a crash; please do not report it as such.)";
290
291 /*
292  * This needs to be static, so that the SIGINT handler can clear the "go"
293  * flag.
294  */
295 static loop_data   global_ld;
296
297
298 /*
299  * Timeout, in milliseconds, for reads from the stream of captured packets
300  * from a capture device.
301  *
302  * A bug in Mac OS X 10.6 and 10.6.1 causes calls to pcap_open_live(), in
303  * 64-bit applications, with sub-second timeouts not to work.  The bug is
304  * fixed in 10.6.2, re-broken in 10.6.3, and again fixed in 10.6.5.
305  */
306 #if defined(__APPLE__) && defined(__LP64__)
307 static gboolean need_timeout_workaround;
308
309 #define CAP_READ_TIMEOUT        (need_timeout_workaround ? 1000 : 250)
310 #else
311 #define CAP_READ_TIMEOUT        250
312 #endif
313
314 /*
315  * Timeout, in microseconds, for reads from the stream of captured packets
316  * from a pipe.  Pipes don't have the same problem that BPF devices do
317  * in OS X 10.6, 10.6.1, 10.6.3, and 10.6.4, so we always use a timeout
318  * of 250ms, i.e. the same value as CAP_READ_TIMEOUT when not on one
319  * of the offending versions of Snow Leopard.
320  *
321  * On Windows this value is converted to milliseconds and passed to
322  * WaitForSingleObject. If it's less than 1000 WaitForSingleObject
323  * will return immediately.
324  */
325 #if defined(_WIN32)
326 #define PIPE_READ_TIMEOUT   100000
327 #else
328 #define PIPE_READ_TIMEOUT   250000
329 #endif
330
331 #define WRITER_THREAD_TIMEOUT 100000 /* usecs */
332
333 static void
334 console_log_handler(const char *log_domain, GLogLevelFlags log_level,
335                     const char *message, gpointer user_data _U_);
336
337 /* capture related options */
338 static capture_options global_capture_opts;
339 static gboolean quiet = FALSE;
340 static gboolean use_threads = FALSE;
341 static guint64 start_time;
342
343 static void capture_loop_write_packet_cb(u_char *pcap_opts_p, const struct pcap_pkthdr *phdr,
344                                          const u_char *pd);
345 static void capture_loop_queue_packet_cb(u_char *pcap_opts_p, const struct pcap_pkthdr *phdr,
346                                          const u_char *pd);
347 static void capture_loop_get_errmsg(char *errmsg, int errmsglen, const char *fname,
348                                     int err, gboolean is_close);
349
350 static void WS_MSVC_NORETURN exit_main(int err) G_GNUC_NORETURN;
351
352 static void report_new_capture_file(const char *filename);
353 static void report_packet_count(int packet_count);
354 static void report_packet_drops(guint32 received, guint32 drops, gchar *name);
355 static void report_capture_error(const char *error_msg, const char *secondary_error_msg);
356 static void report_cfilter_error(capture_options *capture_opts, guint i, const char *errmsg);
357
358 #define MSG_MAX_LENGTH 4096
359
360 /* Copied from pcapio.c libpcap_write_interface_statistics_block()*/
361 static guint64
362 create_timestamp(void) {
363     guint64 timestamp;
364 #ifdef _WIN32
365     FILETIME now;
366 #else
367     struct timeval now;
368 #endif
369
370 #ifdef _WIN32
371     /*
372      * Current time, represented as 100-nanosecond intervals since
373      * January 1, 1601, 00:00:00 UTC.
374      *
375      * I think DWORD might be signed, so cast both parts of "now"
376      * to guint32 so that the sign bit doesn't get treated specially.
377      *
378      * Windows 8 provides GetSystemTimePreciseAsFileTime which we
379      * might want to use instead.
380      */
381     GetSystemTimeAsFileTime(&now);
382     timestamp = (((guint64)(guint32)now.dwHighDateTime) << 32) +
383                 (guint32)now.dwLowDateTime;
384
385     /*
386      * Convert to same thing but as 1-microsecond, i.e. 1000-nanosecond,
387      * intervals.
388      */
389     timestamp /= 10;
390
391     /*
392      * Subtract difference, in microseconds, between January 1, 1601
393      * 00:00:00 UTC and January 1, 1970, 00:00:00 UTC.
394      */
395     timestamp -= G_GINT64_CONSTANT(11644473600000000U);
396 #else
397     /*
398      * Current time, represented as seconds and microseconds since
399      * January 1, 1970, 00:00:00 UTC.
400      */
401     gettimeofday(&now, NULL);
402
403     /*
404      * Convert to delta in microseconds.
405      */
406     timestamp = (guint64)(now.tv_sec) * 1000000 +
407                 (guint64)(now.tv_usec);
408 #endif
409     return timestamp;
410 }
411
412 static void
413 print_usage(gboolean print_ver)
414 {
415     FILE *output;
416
417     if (print_ver) {
418         output = stdout;
419         fprintf(output,
420                 "Dumpcap " VERSION "%s\n"
421                 "Capture network packets and dump them into a pcapng file.\n"
422                 "See http://www.wireshark.org for more information.\n",
423                 wireshark_svnversion);
424     } else {
425         output = stderr;
426     }
427     fprintf(output, "\nUsage: dumpcap [options] ...\n");
428     fprintf(output, "\n");
429     fprintf(output, "Capture interface:\n");
430     fprintf(output, "  -i <interface>           name or idx of interface (def: first non-loopback)\n");
431     fprintf(output, "  -f <capture filter>      packet filter in libpcap filter syntax\n");
432     fprintf(output, "  -s <snaplen>             packet snapshot length (def: 65535)\n");
433     fprintf(output, "  -p                       don't capture in promiscuous mode\n");
434 #ifdef HAVE_PCAP_CREATE
435     fprintf(output, "  -I                       capture in monitor mode, if available\n");
436 #endif
437 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
438     fprintf(output, "  -B <buffer size>         size of kernel buffer (def: 1MB)\n");
439 #endif
440     fprintf(output, "  -y <link type>           link layer type (def: first appropriate)\n");
441     fprintf(output, "  -D                       print list of interfaces and exit\n");
442     fprintf(output, "  -L                       print list of link-layer types of iface and exit\n");
443 #ifdef HAVE_BPF_IMAGE
444     fprintf(output, "  -d                       print generated BPF code for capture filter\n");
445 #endif
446     fprintf(output, "  -S                       print statistics for each interface once per second\n");
447     fprintf(output, "  -M                       for -D, -L, and -S, produce machine-readable output\n");
448     fprintf(output, "\n");
449 #ifdef HAVE_PCAP_REMOTE
450     fprintf(output, "RPCAP options:\n");
451     fprintf(output, "  -r                       don't ignore own RPCAP traffic in capture\n");
452     fprintf(output, "  -u                       use UDP for RPCAP data transfer\n");
453     fprintf(output, "  -A <user>:<password>     use RPCAP password authentication\n");
454 #ifdef HAVE_PCAP_SETSAMPLING
455     fprintf(output, "  -m <sampling type>       use packet sampling\n");
456     fprintf(output, "                           count:NUM - capture one packet of every NUM\n");
457     fprintf(output, "                           timer:NUM - capture no more than 1 packet in NUM ms\n");
458 #endif
459 #endif
460     fprintf(output, "Stop conditions:\n");
461     fprintf(output, "  -c <packet count>        stop after n packets (def: infinite)\n");
462     fprintf(output, "  -a <autostop cond.> ...  duration:NUM - stop after NUM seconds\n");
463     fprintf(output, "                           filesize:NUM - stop this file after NUM KB\n");
464     fprintf(output, "                              files:NUM - stop after NUM files\n");
465     /*fprintf(output, "\n");*/
466     fprintf(output, "Output (files):\n");
467     fprintf(output, "  -w <filename>            name of file to save (def: tempfile)\n");
468     fprintf(output, "  -g                       enable group read access on the output file(s)\n");
469     fprintf(output, "  -b <ringbuffer opt.> ... duration:NUM - switch to next file after NUM secs\n");
470     fprintf(output, "                           filesize:NUM - switch to next file after NUM KB\n");
471     fprintf(output, "                              files:NUM - ringbuffer: replace after NUM files\n");
472     fprintf(output, "  -n                       use pcapng format instead of pcap (default)\n");
473     fprintf(output, "  -P                       use libpcap format instead of pcapng\n");
474     fprintf(output, "\n");
475     fprintf(output, "Miscellaneous:\n");
476     fprintf(output, "  -t                       use a separate thread per interface\n");
477     fprintf(output, "  -q                       don't report packet capture counts\n");
478     fprintf(output, "  -v                       print version information and exit\n");
479     fprintf(output, "  -h                       display this help and exit\n");
480     fprintf(output, "\n");
481     fprintf(output, "Example: dumpcap -i eth0 -a duration:60 -w output.pcapng\n");
482     fprintf(output, "\"Capture network packets from interface eth0 until 60s passed into output.pcapng\"\n");
483     fprintf(output, "\n");
484     fprintf(output, "Use Ctrl-C to stop capturing at any time.\n");
485 }
486
487 static void
488 show_version(GString *comp_info_str, GString *runtime_info_str)
489 {
490     printf(
491         "Dumpcap " VERSION "%s\n"
492         "\n"
493         "%s\n"
494         "%s\n"
495         "%s\n"
496         "See http://www.wireshark.org for more information.\n",
497         wireshark_svnversion, get_copyright_info() ,comp_info_str->str, runtime_info_str->str);
498 }
499
500 /*
501  * Print to the standard error.  This is a command-line tool, so there's
502  * no need to pop up a console.
503  */
504 void
505 vfprintf_stderr(const char *fmt, va_list ap)
506 {
507     vfprintf(stderr, fmt, ap);
508 }
509
510 void
511 fprintf_stderr(const char *fmt, ...)
512 {
513     va_list ap;
514
515     va_start(ap, fmt);
516     vfprintf_stderr(fmt, ap);
517     va_end(ap);
518 }
519
520 /*
521  * Report an error in command-line arguments.
522  */
523 void
524 cmdarg_err(const char *fmt, ...)
525 {
526     va_list ap;
527
528     if(capture_child) {
529         gchar *msg;
530         /* Generate a 'special format' message back to parent */
531         va_start(ap, fmt);
532         msg = g_strdup_vprintf(fmt, ap);
533         sync_pipe_errmsg_to_parent(2, msg, "");
534         g_free(msg);
535         va_end(ap);
536     } else {
537         va_start(ap, fmt);
538         fprintf(stderr, "dumpcap: ");
539         vfprintf(stderr, fmt, ap);
540         fprintf(stderr, "\n");
541         va_end(ap);
542     }
543 }
544
545 /*
546  * Report additional information for an error in command-line arguments.
547  */
548 void
549 cmdarg_err_cont(const char *fmt, ...)
550 {
551     va_list ap;
552
553     if(capture_child) {
554         gchar *msg;
555         va_start(ap, fmt);
556         msg = g_strdup_vprintf(fmt, ap);
557         sync_pipe_errmsg_to_parent(2, msg, "");
558         g_free(msg);
559         va_end(ap);
560     } else {
561         va_start(ap, fmt);
562         vfprintf(stderr, fmt, ap);
563         fprintf(stderr, "\n");
564         va_end(ap);
565     }
566 }
567
568 #ifdef HAVE_LIBCAP
569 static void
570 #if 0 /* Set to enable capability debugging */
571 /* see 'man cap_to_text()' for explanation of output                         */
572 /* '='   means 'all= '  ie: no capabilities                                  */
573 /* '=ip' means 'all=ip' ie: all capabilities are permissible and inheritable */
574 /* ....                                                                      */
575 print_caps(const char *pfx) {
576     cap_t caps = cap_get_proc();
577     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
578           "%s: EUID: %d  Capabilities: %s", pfx,
579           geteuid(), cap_to_text(caps, NULL));
580     cap_free(caps);
581 #else
582 print_caps(const char *pfx _U_) {
583 #endif
584 }
585
586 static void
587 relinquish_all_capabilities(void)
588 {
589     /* Drop any and all capabilities this process may have.            */
590     /* Allowed whether or not process has any privileges.              */
591     cap_t caps = cap_init();    /* all capabilities initialized to off */
592     print_caps("Pre-clear");
593     if (cap_set_proc(caps)) {
594         cmdarg_err("cap_set_proc() fail return: %s", g_strerror(errno));
595     }
596     print_caps("Post-clear");
597     cap_free(caps);
598 }
599 #endif
600
601 static pcap_t *
602 open_capture_device(interface_options *interface_opts,
603                     char (*open_err_str)[PCAP_ERRBUF_SIZE])
604 {
605     pcap_t *pcap_h;
606 #ifdef HAVE_PCAP_CREATE
607     int         err;
608 #endif
609 #if defined(HAVE_PCAP_OPEN) && defined(HAVE_PCAP_REMOTE)
610     struct pcap_rmtauth auth;
611 #endif
612
613     /* Open the network interface to capture from it.
614        Some versions of libpcap may put warnings into the error buffer
615        if they succeed; to tell if that's happened, we have to clear
616        the error buffer, and check if it's still a null string.  */
617     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Entering open_capture_device().");
618     (*open_err_str)[0] = '\0';
619 #if defined(HAVE_PCAP_OPEN) && defined(HAVE_PCAP_REMOTE)
620     /*
621      * If we're opening a remote device, use pcap_open(); that's currently
622      * the only open routine that supports remote devices.
623      */
624     if (strncmp (interface_opts->name, "rpcap://", 8) == 0) {
625         auth.type = interface_opts->auth_type == CAPTURE_AUTH_PWD ?
626             RPCAP_RMTAUTH_PWD : RPCAP_RMTAUTH_NULL;
627         auth.username = interface_opts->auth_username;
628         auth.password = interface_opts->auth_password;
629
630         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
631               "Calling pcap_open() using name %s, snaplen %d, promisc_mode %d, datatx_udp %d, nocap_rpcap %d.",
632               interface_opts->name, interface_opts->snaplen, interface_opts->promisc_mode,
633               interface_opts->datatx_udp, interface_opts->nocap_rpcap);
634         pcap_h = pcap_open(interface_opts->name, interface_opts->snaplen,
635                            /* flags */
636                            (interface_opts->promisc_mode ? PCAP_OPENFLAG_PROMISCUOUS : 0) |
637                            (interface_opts->datatx_udp ? PCAP_OPENFLAG_DATATX_UDP : 0) |
638                            (interface_opts->nocap_rpcap ? PCAP_OPENFLAG_NOCAPTURE_RPCAP : 0),
639                            CAP_READ_TIMEOUT, &auth, *open_err_str);
640         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
641               "pcap_open() returned %p.", (void *)pcap_h);
642     } else
643 #endif
644     {
645         /*
646          * If we're not opening a remote device, use pcap_create() and
647          * pcap_activate() if we have them, so that we can set the buffer
648          * size, otherwise use pcap_open_live().
649          */
650 #ifdef HAVE_PCAP_CREATE
651         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
652               "Calling pcap_create() using %s.", interface_opts->name);
653         pcap_h = pcap_create(interface_opts->name, *open_err_str);
654         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
655               "pcap_create() returned %p.", (void *)pcap_h);
656         if (pcap_h != NULL) {
657             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
658                   "Calling pcap_set_snaplen() with snaplen %d.", interface_opts->snaplen);
659             pcap_set_snaplen(pcap_h, interface_opts->snaplen);
660             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
661                   "Calling pcap_set_promisc() with promisc_mode %d.", interface_opts->promisc_mode);
662             pcap_set_promisc(pcap_h, interface_opts->promisc_mode);
663             pcap_set_timeout(pcap_h, CAP_READ_TIMEOUT);
664
665             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
666                   "buffersize %d.", interface_opts->buffer_size);
667             if (interface_opts->buffer_size > 1) {
668                 pcap_set_buffer_size(pcap_h, interface_opts->buffer_size * 1024 * 1024);
669             }
670             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
671                   "monitor_mode %d.", interface_opts->monitor_mode);
672             if (interface_opts->monitor_mode)
673                 pcap_set_rfmon(pcap_h, 1);
674             err = pcap_activate(pcap_h);
675             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
676                   "pcap_activate() returned %d.", err);
677             if (err < 0) {
678                 /* Failed to activate, set to NULL */
679                 if (err == PCAP_ERROR)
680                     g_strlcpy(*open_err_str, pcap_geterr(pcap_h), sizeof *open_err_str);
681                 else
682                     g_strlcpy(*open_err_str, pcap_statustostr(err), sizeof *open_err_str);
683                 pcap_close(pcap_h);
684                 pcap_h = NULL;
685             }
686         }
687 #else
688         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
689               "pcap_open_live() calling using name %s, snaplen %d, promisc_mode %d.",
690               interface_opts->name, interface_opts->snaplen, interface_opts->promisc_mode);
691         pcap_h = pcap_open_live(interface_opts->name, interface_opts->snaplen,
692                                 interface_opts->promisc_mode, CAP_READ_TIMEOUT,
693                                 *open_err_str);
694         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
695               "pcap_open_live() returned %p.", (void *)pcap_h);
696 #endif
697     }
698     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "open_capture_device %s : %s", pcap_h ? "SUCCESS" : "FAILURE", interface_opts->name);
699     return pcap_h;
700 }
701
702 static void
703 get_capture_device_open_failure_messages(const char *open_err_str,
704                                          const char *iface
705 #ifndef _WIN32
706                                                            _U_
707 #endif
708                                          ,
709                                          char *errmsg, size_t errmsg_len,
710                                          char *secondary_errmsg,
711                                          size_t secondary_errmsg_len)
712 {
713     const char *libpcap_warn;
714     static const char ppamsg[] = "can't find PPA for ";
715
716     /* If we got a "can't find PPA for X" message, warn the user (who
717        is running dumpcap on HP-UX) that they don't have a version of
718        libpcap that properly handles HP-UX (libpcap 0.6.x and later
719        versions, which properly handle HP-UX, say "can't find /dev/dlpi
720        PPA for X" rather than "can't find PPA for X"). */
721     if (strncmp(open_err_str, ppamsg, sizeof ppamsg - 1) == 0)
722         libpcap_warn =
723             "\n\n"
724             "You are running (T)Wireshark with a version of the libpcap library\n"
725             "that doesn't handle HP-UX network devices well; this means that\n"
726             "(T)Wireshark may not be able to capture packets.\n"
727             "\n"
728             "To fix this, you should install libpcap 0.6.2, or a later version\n"
729             "of libpcap, rather than libpcap 0.4 or 0.5.x.  It is available in\n"
730             "packaged binary form from the Software Porting And Archive Centre\n"
731             "for HP-UX; the Centre is at http://hpux.connect.org.uk/ - the page\n"
732             "at the URL lists a number of mirror sites.";
733     else
734         libpcap_warn = "";
735     g_snprintf(errmsg, (gulong) errmsg_len,
736                "The capture session could not be initiated (%s).", open_err_str);
737 #ifdef _WIN32
738     if (!has_wpcap) {
739       g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len,
740                  "\n"
741                  "In order to capture packets, WinPcap must be installed; see\n"
742                  "\n"
743                  "        http://www.winpcap.org/\n"
744                  "\n"
745                  "or the mirror at\n"
746                  "\n"
747                  "        http://www.mirrors.wiretapped.net/security/packet-capture/winpcap/\n"
748                  "\n"
749                  "or the mirror at\n"
750                  "\n"
751                  "        http://winpcap.cs.pu.edu.tw/\n"
752                  "\n"
753                  "for a downloadable version of WinPcap and for instructions on how to install\n"
754                  "WinPcap.");
755     } else {
756       g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len,
757                  "\n"
758                  "Please check that \"%s\" is the proper interface.\n"
759                  "\n"
760                  "\n"
761                  "Help can be found at:\n"
762                  "\n"
763                  "       http://wiki.wireshark.org/WinPcap\n"
764                  "       http://wiki.wireshark.org/CaptureSetup\n",
765                  iface);
766     }
767 #else
768     g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len,
769                "Please check to make sure you have sufficient permissions, and that you have "
770                "the proper interface or pipe specified.%s", libpcap_warn);
771 #endif /* _WIN32 */
772 }
773
774 /* Set the data link type on a pcap. */
775 static gboolean
776 set_pcap_linktype(pcap_t *pcap_h, int linktype,
777 #ifdef HAVE_PCAP_SET_DATALINK
778                   char *name _U_,
779 #else
780                   char *name,
781 #endif
782                   char *errmsg, size_t errmsg_len,
783                   char *secondary_errmsg, size_t secondary_errmsg_len)
784 {
785     char *set_linktype_err_str;
786
787     if (linktype == -1)
788         return TRUE; /* just use the default */
789 #ifdef HAVE_PCAP_SET_DATALINK
790     if (pcap_set_datalink(pcap_h, linktype) == 0)
791         return TRUE; /* no error */
792     set_linktype_err_str = pcap_geterr(pcap_h);
793 #else
794     /* Let them set it to the type it is; reject any other request. */
795     if (get_pcap_linktype(pcap_h, name) == linktype)
796         return TRUE; /* no error */
797     set_linktype_err_str =
798         "That DLT isn't one of the DLTs supported by this device";
799 #endif
800     g_snprintf(errmsg, (gulong) errmsg_len, "Unable to set data link type (%s).",
801                set_linktype_err_str);
802     /*
803      * If the error isn't "XXX is not one of the DLTs supported by this device",
804      * tell the user to tell the Wireshark developers about it.
805      */
806     if (strstr(set_linktype_err_str, "is not one of the DLTs supported by this device") == NULL)
807         g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len, please_report);
808     else
809         secondary_errmsg[0] = '\0';
810     return FALSE;
811 }
812
813 static gboolean
814 compile_capture_filter(const char *iface, pcap_t *pcap_h,
815                        struct bpf_program *fcode, const char *cfilter)
816 {
817     bpf_u_int32 netnum, netmask;
818     gchar       lookup_net_err_str[PCAP_ERRBUF_SIZE];
819
820     if (pcap_lookupnet(iface, &netnum, &netmask, lookup_net_err_str) < 0) {
821         /*
822          * Well, we can't get the netmask for this interface; it's used
823          * only for filters that check for broadcast IP addresses, so
824          * we just punt and use 0.  It might be nice to warn the user,
825          * but that's a pain in a GUI application, as it'd involve popping
826          * up a message box, and it's not clear how often this would make
827          * a difference (only filters that check for IP broadcast addresses
828          * use the netmask).
829          */
830         /*cmdarg_err(
831           "Warning:  Couldn't obtain netmask info (%s).", lookup_net_err_str);*/
832         netmask = 0;
833     }
834
835     /*
836      * Sigh.  Older versions of libpcap don't properly declare the
837      * third argument to pcap_compile() as a const pointer.  Cast
838      * away the warning.
839      */
840     if (pcap_compile(pcap_h, fcode, (char *)cfilter, 1, netmask) < 0)
841         return FALSE;
842     return TRUE;
843 }
844
845 #ifdef HAVE_BPF_IMAGE
846 static gboolean
847 show_filter_code(capture_options *capture_opts)
848 {
849     interface_options interface_opts;
850     pcap_t *pcap_h;
851     gchar open_err_str[PCAP_ERRBUF_SIZE];
852     char errmsg[MSG_MAX_LENGTH+1];
853     char secondary_errmsg[MSG_MAX_LENGTH+1];
854     struct bpf_program fcode;
855     struct bpf_insn *insn;
856     u_int i;
857     guint j;
858
859     for (j = 0; j < capture_opts->ifaces->len; j++) {
860         interface_opts = g_array_index(capture_opts->ifaces, interface_options, j);
861         pcap_h = open_capture_device(&interface_opts, &open_err_str);
862         if (pcap_h == NULL) {
863             /* Open failed; get messages */
864             get_capture_device_open_failure_messages(open_err_str,
865                                                      interface_opts.name,
866                                                      errmsg, sizeof errmsg,
867                                                      secondary_errmsg,
868                                                      sizeof secondary_errmsg);
869             /* And report them */
870             report_capture_error(errmsg, secondary_errmsg);
871             return FALSE;
872         }
873
874         /* Set the link-layer type. */
875         if (!set_pcap_linktype(pcap_h, interface_opts.linktype, interface_opts.name,
876                                errmsg, sizeof errmsg,
877                                secondary_errmsg, sizeof secondary_errmsg)) {
878             pcap_close(pcap_h);
879             report_capture_error(errmsg, secondary_errmsg);
880             return FALSE;
881         }
882
883         /* OK, try to compile the capture filter. */
884         if (!compile_capture_filter(interface_opts.name, pcap_h, &fcode,
885                                     interface_opts.cfilter)) {
886             pcap_close(pcap_h);
887             report_cfilter_error(capture_opts, j, errmsg);
888             return FALSE;
889         }
890         pcap_close(pcap_h);
891
892         /* Now print the filter code. */
893         insn = fcode.bf_insns;
894
895         for (i = 0; i < fcode.bf_len; insn++, i++)
896             printf("%s\n", bpf_image(insn, i));
897     }
898     /* If not using libcap: we now can now set euid/egid to ruid/rgid         */
899     /*  to remove any suid privileges.                                        */
900     /* If using libcap: we can now remove NET_RAW and NET_ADMIN capabilities  */
901     /*  (euid/egid have already previously been set to ruid/rgid.             */
902     /* (See comment in main() for details)                                    */
903 #ifndef HAVE_LIBCAP
904     relinquish_special_privs_perm();
905 #else
906     relinquish_all_capabilities();
907 #endif
908     if (capture_child) {
909         /* Let our parent know we succeeded. */
910         pipe_write_block(2, SP_SUCCESS, NULL);
911     }
912     return TRUE;
913 }
914 #endif
915
916 /*
917  * capture_interface_list() is expected to do the right thing to get
918  * a list of interfaces.
919  *
920  * In most of the programs in the Wireshark suite, "the right thing"
921  * is to run dumpcap and ask it for the list, because dumpcap may
922  * be the only program in the suite with enough privileges to get
923  * the list.
924  *
925  * In dumpcap itself, however, we obviously can't run dumpcap to
926  * ask for the list.  Therefore, our capture_interface_list() should
927  * just call get_interface_list().
928  */
929 GList *
930 capture_interface_list(int *err, char **err_str)
931 {
932     return get_interface_list(err, err_str);
933 }
934
935 /*
936  * Get the data-link type for a libpcap device.
937  * This works around AIX 5.x's non-standard and incompatible-with-the-
938  * rest-of-the-universe libpcap.
939  */
940 static int
941 get_pcap_linktype(pcap_t *pch, const char *devname
942 #ifndef _AIX
943         _U_
944 #endif
945 )
946 {
947     int linktype;
948 #ifdef _AIX
949     const char *ifacename;
950 #endif
951
952     linktype = pcap_datalink(pch);
953 #ifdef _AIX
954
955     /*
956      * The libpcap that comes with AIX 5.x uses RFC 1573 ifType values
957      * rather than DLT_ values for link-layer types; the ifType values
958      * for LAN devices are:
959      *
960      *  Ethernet        6
961      *  802.3           7
962      *  Token Ring      9
963      *  FDDI            15
964      *
965      * and the ifType value for a loopback device is 24.
966      *
967      * The AIX names for LAN devices begin with:
968      *
969      *  Ethernet                en
970      *  802.3                   et
971      *  Token Ring              tr
972      *  FDDI                    fi
973      *
974      * and the AIX names for loopback devices begin with "lo".
975      *
976      * (The difference between "Ethernet" and "802.3" is presumably
977      * whether packets have an Ethernet header, with a packet type,
978      * or an 802.3 header, with a packet length, followed by an 802.2
979      * header and possibly a SNAP header.)
980      *
981      * If the device name matches "linktype" interpreted as an ifType
982      * value, rather than as a DLT_ value, we will assume this is AIX's
983      * non-standard, incompatible libpcap, rather than a standard libpcap,
984      * and will map the link-layer type to the standard DLT_ value for
985      * that link-layer type, as that's what the rest of Wireshark expects.
986      *
987      * (This means the capture files won't be readable by a tcpdump
988      * linked with AIX's non-standard libpcap, but so it goes.  They
989      * *will* be readable by standard versions of tcpdump, Wireshark,
990      * and so on.)
991      *
992      * XXX - if we conclude we're using AIX libpcap, should we also
993      * set a flag to cause us to assume the time stamps are in
994      * seconds-and-nanoseconds form, and to convert them to
995      * seconds-and-microseconds form before processing them and
996      * writing them out?
997      */
998
999     /*
1000      * Find the last component of the device name, which is the
1001      * interface name.
1002      */
1003     ifacename = strchr(devname, '/');
1004     if (ifacename == NULL)
1005         ifacename = devname;
1006
1007     /* See if it matches any of the LAN device names. */
1008     if (strncmp(ifacename, "en", 2) == 0) {
1009         if (linktype == 6) {
1010             /*
1011              * That's the RFC 1573 value for Ethernet; map it to DLT_EN10MB.
1012              */
1013             linktype = 1;
1014         }
1015     } else if (strncmp(ifacename, "et", 2) == 0) {
1016         if (linktype == 7) {
1017             /*
1018              * That's the RFC 1573 value for 802.3; map it to DLT_EN10MB.
1019              * (libpcap, tcpdump, Wireshark, etc. don't care if it's Ethernet
1020              * or 802.3.)
1021              */
1022             linktype = 1;
1023         }
1024     } else if (strncmp(ifacename, "tr", 2) == 0) {
1025         if (linktype == 9) {
1026             /*
1027              * That's the RFC 1573 value for 802.5 (Token Ring); map it to
1028              * DLT_IEEE802, which is what's used for Token Ring.
1029              */
1030             linktype = 6;
1031         }
1032     } else if (strncmp(ifacename, "fi", 2) == 0) {
1033         if (linktype == 15) {
1034             /*
1035              * That's the RFC 1573 value for FDDI; map it to DLT_FDDI.
1036              */
1037             linktype = 10;
1038         }
1039     } else if (strncmp(ifacename, "lo", 2) == 0) {
1040         if (linktype == 24) {
1041             /*
1042              * That's the RFC 1573 value for "software loopback" devices; map it
1043              * to DLT_NULL, which is what's used for loopback devices on BSD.
1044              */
1045             linktype = 0;
1046         }
1047     }
1048 #endif
1049
1050     return linktype;
1051 }
1052
1053 static data_link_info_t *
1054 create_data_link_info(int dlt)
1055 {
1056     data_link_info_t *data_link_info;
1057     const char *text;
1058
1059     data_link_info = (data_link_info_t *)g_malloc(sizeof (data_link_info_t));
1060     data_link_info->dlt = dlt;
1061     text = pcap_datalink_val_to_name(dlt);
1062     if (text != NULL)
1063         data_link_info->name = g_strdup(text);
1064     else
1065         data_link_info->name = g_strdup_printf("DLT %d", dlt);
1066     text = pcap_datalink_val_to_description(dlt);
1067     if (text != NULL)
1068         data_link_info->description = g_strdup(text);
1069     else
1070         data_link_info->description = NULL;
1071     return data_link_info;
1072 }
1073
1074 /*
1075  * Get the capabilities of a network device.
1076  */
1077 static if_capabilities_t *
1078 get_if_capabilities(const char *devname, gboolean monitor_mode
1079 #ifndef HAVE_PCAP_CREATE
1080         _U_
1081 #endif
1082 , char **err_str)
1083 {
1084     if_capabilities_t *caps;
1085     char errbuf[PCAP_ERRBUF_SIZE];
1086     pcap_t *pch;
1087 #ifdef HAVE_PCAP_CREATE
1088     int status;
1089 #endif
1090     int deflt;
1091 #ifdef HAVE_PCAP_LIST_DATALINKS
1092     int *linktypes;
1093     int i, nlt;
1094 #endif
1095     data_link_info_t *data_link_info;
1096
1097     /*
1098      * Allocate the interface capabilities structure.
1099      */
1100     caps = g_malloc(sizeof *caps);
1101
1102     /*
1103      * WinPcap 4.1.2, and possibly earlier versions, have a bug
1104      * wherein, when an open with an rpcap: URL fails, the error
1105      * message for the error is not copied to errbuf and whatever
1106      * on-the-stack junk is in errbuf is treated as the error
1107      * message.
1108      *
1109      * To work around that (and any other bugs of that sort, we
1110      * initialize errbuf to an empty string.  If we get an error
1111      * and the string is empty, we report it as an unknown error.
1112      * (If we *don't* get an error, and the string is *non*-empty,
1113      * that could be a warning returned, such as "can't turn
1114      * promiscuous mode on"; we currently don't do so.)
1115      */
1116     errbuf[0] = '\0';
1117 #ifdef HAVE_PCAP_OPEN
1118     pch = pcap_open(devname, MIN_PACKET_SIZE, 0, 0, NULL, errbuf);
1119     caps->can_set_rfmon = FALSE;
1120     if (pch == NULL) {
1121         if (err_str != NULL)
1122             *err_str = g_strdup(errbuf[0] == '\0' ? "Unknown error (pcap bug; actual error cause not reported)" : errbuf);
1123         g_free(caps);
1124         return NULL;
1125     }
1126 #elif defined(HAVE_PCAP_CREATE)
1127     pch = pcap_create(devname, errbuf);
1128     if (pch == NULL) {
1129         if (err_str != NULL)
1130             *err_str = g_strdup(errbuf);
1131         g_free(caps);
1132         return NULL;
1133     }
1134     status = pcap_can_set_rfmon(pch);
1135     if (status < 0) {
1136         /* Error. */
1137         if (status == PCAP_ERROR)
1138             *err_str = g_strdup_printf("pcap_can_set_rfmon() failed: %s",
1139                                        pcap_geterr(pch));
1140         else
1141             *err_str = g_strdup(pcap_statustostr(status));
1142         pcap_close(pch);
1143         g_free(caps);
1144         return NULL;
1145     }
1146     if (status == 0)
1147         caps->can_set_rfmon = FALSE;
1148     else if (status == 1) {
1149         caps->can_set_rfmon = TRUE;
1150         if (monitor_mode)
1151             pcap_set_rfmon(pch, 1);
1152     } else {
1153         if (err_str != NULL) {
1154             *err_str = g_strdup_printf("pcap_can_set_rfmon() returned %d",
1155                                        status);
1156         }
1157         pcap_close(pch);
1158         g_free(caps);
1159         return NULL;
1160     }
1161
1162     status = pcap_activate(pch);
1163     if (status < 0) {
1164         /* Error.  We ignore warnings (status > 0). */
1165         if (err_str != NULL) {
1166             if (status == PCAP_ERROR)
1167                 *err_str = g_strdup_printf("pcap_activate() failed: %s",
1168                                            pcap_geterr(pch));
1169             else
1170                 *err_str = g_strdup(pcap_statustostr(status));
1171         }
1172         pcap_close(pch);
1173         g_free(caps);
1174         return NULL;
1175     }
1176 #else
1177     pch = pcap_open_live(devname, MIN_PACKET_SIZE, 0, 0, errbuf);
1178     caps->can_set_rfmon = FALSE;
1179     if (pch == NULL) {
1180         if (err_str != NULL)
1181             *err_str = g_strdup(errbuf[0] == '\0' ? "Unknown error (pcap bug; actual error cause not reported)" : errbuf);
1182         g_free(caps);
1183         return NULL;
1184     }
1185 #endif
1186     deflt = get_pcap_linktype(pch, devname);
1187 #ifdef HAVE_PCAP_LIST_DATALINKS
1188     nlt = pcap_list_datalinks(pch, &linktypes);
1189     if (nlt == 0 || linktypes == NULL) {
1190         pcap_close(pch);
1191         if (err_str != NULL)
1192             *err_str = NULL; /* an empty list doesn't mean an error */
1193         return NULL;
1194     }
1195     caps->data_link_types = NULL;
1196     for (i = 0; i < nlt; i++) {
1197         data_link_info = create_data_link_info(linktypes[i]);
1198
1199         /*
1200          * XXX - for 802.11, make the most detailed 802.11
1201          * version the default, rather than the one the
1202          * device has as the default?
1203          */
1204         if (linktypes[i] == deflt)
1205             caps->data_link_types = g_list_prepend(caps->data_link_types,
1206                                                    data_link_info);
1207         else
1208             caps->data_link_types = g_list_append(caps->data_link_types,
1209                                                   data_link_info);
1210     }
1211 #ifdef HAVE_PCAP_FREE_DATALINKS
1212     pcap_free_datalinks(linktypes);
1213 #else
1214     /*
1215      * In Windows, there's no guarantee that if you have a library
1216      * built with one version of the MSVC++ run-time library, and
1217      * it returns a pointer to allocated data, you can free that
1218      * data from a program linked with another version of the
1219      * MSVC++ run-time library.
1220      *
1221      * This is not an issue on UN*X.
1222      *
1223      * See the mail threads starting at
1224      *
1225      *    http://www.winpcap.org/pipermail/winpcap-users/2006-September/001421.html
1226      *
1227      * and
1228      *
1229      *    http://www.winpcap.org/pipermail/winpcap-users/2008-May/002498.html
1230      */
1231 #ifndef _WIN32
1232 #define xx_free free  /* hack so checkAPIs doesn't complain */
1233     xx_free(linktypes);
1234 #endif /* _WIN32 */
1235 #endif /* HAVE_PCAP_FREE_DATALINKS */
1236 #else /* HAVE_PCAP_LIST_DATALINKS */
1237
1238     data_link_info = create_data_link_info(deflt);
1239     caps->data_link_types = g_list_append(caps->data_link_types,
1240                                           data_link_info);
1241 #endif /* HAVE_PCAP_LIST_DATALINKS */
1242
1243     pcap_close(pch);
1244
1245     if (err_str != NULL)
1246         *err_str = NULL;
1247     return caps;
1248 }
1249
1250 #define ADDRSTRLEN 46 /* Covers IPv4 & IPv6 */
1251 static void
1252 print_machine_readable_interfaces(GList *if_list)
1253 {
1254     int         i;
1255     GList       *if_entry;
1256     if_info_t   *if_info;
1257     GSList      *addr;
1258     if_addr_t   *if_addr;
1259     char        addr_str[ADDRSTRLEN];
1260
1261     if (capture_child) {
1262         /* Let our parent know we succeeded. */
1263         pipe_write_block(2, SP_SUCCESS, NULL);
1264     }
1265
1266     i = 1;  /* Interface id number */
1267     for (if_entry = g_list_first(if_list); if_entry != NULL;
1268          if_entry = g_list_next(if_entry)) {
1269         if_info = (if_info_t *)if_entry->data;
1270         printf("%d. %s", i++, if_info->name);
1271
1272         /*
1273          * Print the contents of the if_entry struct in a parseable format.
1274          * Each if_entry element is tab-separated.  Addresses are comma-
1275          * separated.
1276          */
1277         /* XXX - Make sure our description doesn't contain a tab */
1278         if (if_info->description != NULL)
1279             printf("\t%s\t", if_info->description);
1280         else
1281             printf("\t\t");
1282
1283         for(addr = g_slist_nth(if_info->addrs, 0); addr != NULL;
1284                     addr = g_slist_next(addr)) {
1285             if (addr != g_slist_nth(if_info->addrs, 0))
1286                 printf(",");
1287
1288             if_addr = (if_addr_t *)addr->data;
1289             switch(if_addr->ifat_type) {
1290             case IF_AT_IPv4:
1291                 if (inet_ntop(AF_INET, &if_addr->addr.ip4_addr, addr_str,
1292                               ADDRSTRLEN)) {
1293                     printf("%s", addr_str);
1294                 } else {
1295                     printf("<unknown IPv4>");
1296                 }
1297                 break;
1298             case IF_AT_IPv6:
1299                 if (inet_ntop(AF_INET6, &if_addr->addr.ip6_addr,
1300                               addr_str, ADDRSTRLEN)) {
1301                     printf("%s", addr_str);
1302                 } else {
1303                     printf("<unknown IPv6>");
1304                 }
1305                 break;
1306             default:
1307                 printf("<type unknown %u>", if_addr->ifat_type);
1308             }
1309         }
1310
1311         if (if_info->loopback)
1312             printf("\tloopback");
1313         else
1314             printf("\tnetwork");
1315
1316         printf("\n");
1317     }
1318 }
1319
1320 /*
1321  * If you change the machine-readable output format of this function,
1322  * you MUST update capture_ifinfo.c:capture_get_if_capabilities() accordingly!
1323  */
1324 static void
1325 print_machine_readable_if_capabilities(if_capabilities_t *caps)
1326 {
1327     GList *lt_entry;
1328     data_link_info_t *data_link_info;
1329     const gchar *desc_str;
1330
1331     if (capture_child) {
1332         /* Let our parent know we succeeded. */
1333         pipe_write_block(2, SP_SUCCESS, NULL);
1334     }
1335
1336     if (caps->can_set_rfmon)
1337         printf("1\n");
1338     else
1339         printf("0\n");
1340     for (lt_entry = caps->data_link_types; lt_entry != NULL;
1341          lt_entry = g_list_next(lt_entry)) {
1342       data_link_info = (data_link_info_t *)lt_entry->data;
1343       if (data_link_info->description != NULL)
1344         desc_str = data_link_info->description;
1345       else
1346         desc_str = "(not supported)";
1347       printf("%d\t%s\t%s\n", data_link_info->dlt, data_link_info->name,
1348              desc_str);
1349     }
1350 }
1351
1352 typedef struct {
1353     char *name;
1354     pcap_t *pch;
1355 } if_stat_t;
1356
1357 /* Print the number of packets captured for each interface until we're killed. */
1358 static int
1359 print_statistics_loop(gboolean machine_readable)
1360 {
1361     GList       *if_list, *if_entry, *stat_list = NULL, *stat_entry;
1362     if_info_t   *if_info;
1363     if_stat_t   *if_stat;
1364     int         err;
1365     gchar       *err_str;
1366     pcap_t      *pch;
1367     char        errbuf[PCAP_ERRBUF_SIZE];
1368     struct pcap_stat ps;
1369
1370     if_list = get_interface_list(&err, &err_str);
1371     if (if_list == NULL) {
1372         switch (err) {
1373         case CANT_GET_INTERFACE_LIST:
1374         case DONT_HAVE_PCAP:
1375             cmdarg_err("%s", err_str);
1376             g_free(err_str);
1377             break;
1378
1379         case NO_INTERFACES_FOUND:
1380             cmdarg_err("There are no interfaces on which a capture can be done");
1381             break;
1382         }
1383         return err;
1384     }
1385
1386     for (if_entry = g_list_first(if_list); if_entry != NULL; if_entry = g_list_next(if_entry)) {
1387         if_info = (if_info_t *)if_entry->data;
1388 #ifdef HAVE_PCAP_OPEN
1389         pch = pcap_open(if_info->name, MIN_PACKET_SIZE, 0, 0, NULL, errbuf);
1390 #else
1391         pch = pcap_open_live(if_info->name, MIN_PACKET_SIZE, 0, 0, errbuf);
1392 #endif
1393
1394         if (pch) {
1395             if_stat = (if_stat_t *)g_malloc(sizeof(if_stat_t));
1396             if_stat->name = g_strdup(if_info->name);
1397             if_stat->pch = pch;
1398             stat_list = g_list_append(stat_list, if_stat);
1399         }
1400     }
1401
1402     if (!stat_list) {
1403         cmdarg_err("There are no interfaces on which a capture can be done");
1404         return 2;
1405     }
1406
1407     if (capture_child) {
1408         /* Let our parent know we succeeded. */
1409         pipe_write_block(2, SP_SUCCESS, NULL);
1410     }
1411
1412     if (!machine_readable) {
1413         printf("%-15s  %10s  %10s\n", "Interface", "Received",
1414             "Dropped");
1415     }
1416
1417     global_ld.go = TRUE;
1418     while (global_ld.go) {
1419         for (stat_entry = g_list_first(stat_list); stat_entry != NULL; stat_entry = g_list_next(stat_entry)) {
1420             if_stat = (if_stat_t *)stat_entry->data;
1421             pcap_stats(if_stat->pch, &ps);
1422
1423             if (!machine_readable) {
1424                 printf("%-15s  %10u  %10u\n", if_stat->name,
1425                     ps.ps_recv, ps.ps_drop);
1426             } else {
1427                 printf("%s\t%u\t%u\n", if_stat->name,
1428                     ps.ps_recv, ps.ps_drop);
1429                 fflush(stdout);
1430             }
1431         }
1432 #ifdef _WIN32
1433         Sleep(1 * 1000);
1434 #else
1435         sleep(1);
1436 #endif
1437     }
1438
1439     /* XXX - Not reached.  Should we look for 'q' in stdin? */
1440     for (stat_entry = g_list_first(stat_list); stat_entry != NULL; stat_entry = g_list_next(stat_entry)) {
1441         if_stat = (if_stat_t *)stat_entry->data;
1442         pcap_close(if_stat->pch);
1443         g_free(if_stat->name);
1444         g_free(if_stat);
1445     }
1446     g_list_free(stat_list);
1447     free_interface_list(if_list);
1448
1449     return 0;
1450 }
1451
1452
1453 #ifdef _WIN32
1454 static BOOL WINAPI
1455 capture_cleanup_handler(DWORD dwCtrlType)
1456 {
1457     /* CTRL_C_EVENT is sort of like SIGINT, CTRL_BREAK_EVENT is unique to
1458        Windows, CTRL_CLOSE_EVENT is sort of like SIGHUP, CTRL_LOGOFF_EVENT
1459        is also sort of like SIGHUP, and CTRL_SHUTDOWN_EVENT is sort of
1460        like SIGTERM at least when the machine's shutting down.
1461
1462        For now, if we're running as a command rather than a capture child,
1463        we handle all but CTRL_LOGOFF_EVENT as indications that we should
1464        clean up and quit, just as we handle SIGINT, SIGHUP, and SIGTERM
1465        in that way on UN*X.
1466
1467        If we're not running as a capture child, we might be running as
1468        a service; ignore CTRL_LOGOFF_EVENT, so we keep running after the
1469        user logs out.  (XXX - can we explicitly check whether we're
1470        running as a service?) */
1471
1472     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
1473         "Console: Control signal");
1474     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
1475         "Console: Control signal, CtrlType: %u", dwCtrlType);
1476
1477     /* Keep capture running if we're a service and a user logs off */
1478     if (capture_child || (dwCtrlType != CTRL_LOGOFF_EVENT)) {
1479         capture_loop_stop();
1480         return TRUE;
1481     } else {
1482         return FALSE;
1483     }
1484 }
1485 #else
1486 static void
1487 capture_cleanup_handler(int signum _U_)
1488 {
1489     /* On UN*X, we cleanly shut down the capture on SIGINT, SIGHUP, and
1490        SIGTERM.  We assume that if the user wanted it to keep running
1491        after they logged out, they'd have nohupped it. */
1492
1493     /* Note: don't call g_log() in the signal handler: if we happened to be in
1494      * g_log() in process context when the signal came in, g_log will detect
1495      * the "recursion" and abort.
1496      */
1497
1498     capture_loop_stop();
1499 }
1500 #endif
1501
1502
1503 static void
1504 report_capture_count(gboolean reportit)
1505 {
1506     /* Don't print this if we're a capture child. */
1507     if (!capture_child && reportit) {
1508         fprintf(stderr, "\rPackets captured: %u\n", global_ld.packet_count);
1509         /* stderr could be line buffered */
1510         fflush(stderr);
1511     }
1512 }
1513
1514
1515 #ifdef SIGINFO
1516 static void
1517 report_counts_for_siginfo(void)
1518 {
1519     report_capture_count(quiet);
1520     infoprint = FALSE; /* we just reported it */
1521 }
1522
1523 static void
1524 report_counts_siginfo(int signum _U_)
1525 {
1526     int sav_errno = errno;
1527
1528     /* If we've been told to delay printing, just set a flag asking
1529        that we print counts (if we're supposed to), otherwise print
1530        the count of packets captured (if we're supposed to). */
1531     if (infodelay)
1532         infoprint = TRUE;
1533     else
1534         report_counts_for_siginfo();
1535     errno = sav_errno;
1536 }
1537 #endif /* SIGINFO */
1538
1539 static void
1540 exit_main(int status)
1541 {
1542 #ifdef _WIN32
1543     /* Shutdown windows sockets */
1544     WSACleanup();
1545
1546     /* can be helpful for debugging */
1547 #ifdef DEBUG_DUMPCAP
1548     printf("Press any key\n");
1549     _getch();
1550 #endif
1551
1552 #endif /* _WIN32 */
1553
1554     exit(status);
1555 }
1556
1557 #ifdef HAVE_LIBCAP
1558 /*
1559  * If we were linked with libcap (not libpcap), make sure we have
1560  * CAP_NET_ADMIN and CAP_NET_RAW, then relinquish our permissions.
1561  * (See comment in main() for details)
1562  */
1563 static void
1564 relinquish_privs_except_capture(void)
1565 {
1566     /* If 'started_with_special_privs' (ie: suid) then enable for
1567      *  ourself the  NET_ADMIN and NET_RAW capabilities and then
1568      *  drop our suid privileges.
1569      *
1570      * CAP_NET_ADMIN: Promiscuous mode and a truckload of other
1571      *                stuff we don't need (and shouldn't have).
1572      * CAP_NET_RAW:   Packet capture (raw sockets).
1573      */
1574
1575     if (started_with_special_privs()) {
1576         cap_value_t cap_list[2] = { CAP_NET_ADMIN, CAP_NET_RAW };
1577         int cl_len = sizeof(cap_list) / sizeof(cap_value_t);
1578
1579         cap_t caps = cap_init();    /* all capabilities initialized to off */
1580
1581         print_caps("Pre drop, pre set");
1582
1583         if (prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0) == -1) {
1584             cmdarg_err("prctl() fail return: %s", g_strerror(errno));
1585         }
1586
1587         cap_set_flag(caps, CAP_PERMITTED,   cl_len, cap_list, CAP_SET);
1588         cap_set_flag(caps, CAP_INHERITABLE, cl_len, cap_list, CAP_SET);
1589
1590         if (cap_set_proc(caps)) {
1591             cmdarg_err("cap_set_proc() fail return: %s", g_strerror(errno));
1592         }
1593         print_caps("Pre drop, post set");
1594
1595         relinquish_special_privs_perm();
1596
1597         print_caps("Post drop, pre set");
1598         cap_set_flag(caps, CAP_EFFECTIVE,   cl_len, cap_list, CAP_SET);
1599         if (cap_set_proc(caps)) {
1600             cmdarg_err("cap_set_proc() fail return: %s", g_strerror(errno));
1601         }
1602         print_caps("Post drop, post set");
1603
1604         cap_free(caps);
1605     }
1606 }
1607
1608 #endif /* HAVE_LIBCAP */
1609
1610 /* Take care of byte order in the libpcap headers read from pipes.
1611  * (function taken from wiretap/libpcap.c) */
1612 static void
1613 cap_pipe_adjust_header(gboolean byte_swapped, struct pcap_hdr *hdr, struct pcaprec_hdr *rechdr)
1614 {
1615     if (byte_swapped) {
1616         /* Byte-swap the record header fields. */
1617         rechdr->ts_sec = BSWAP32(rechdr->ts_sec);
1618         rechdr->ts_usec = BSWAP32(rechdr->ts_usec);
1619         rechdr->incl_len = BSWAP32(rechdr->incl_len);
1620         rechdr->orig_len = BSWAP32(rechdr->orig_len);
1621     }
1622
1623     /* In file format version 2.3, the "incl_len" and "orig_len" fields were
1624        swapped, in order to match the BPF header layout.
1625
1626        Unfortunately, some files were, according to a comment in the "libpcap"
1627        source, written with version 2.3 in their headers but without the
1628        interchanged fields, so if "incl_len" is greater than "orig_len" - which
1629        would make no sense - we assume that we need to swap them.  */
1630     if (hdr->version_major == 2 &&
1631         (hdr->version_minor < 3 ||
1632          (hdr->version_minor == 3 && rechdr->incl_len > rechdr->orig_len))) {
1633         guint32 temp;
1634
1635         temp = rechdr->orig_len;
1636         rechdr->orig_len = rechdr->incl_len;
1637         rechdr->incl_len = temp;
1638     }
1639 }
1640
1641 #if defined(_WIN32)
1642 /*
1643  * Thread function that reads from a pipe and pushes the data
1644  * to the main application thread.
1645  */
1646 /*
1647  * XXX Right now we use async queues for basic signaling. The main thread
1648  * sets cap_pipe_buf and cap_bytes_to_read, then pushes an item onto
1649  * cap_pipe_pending_q which triggers a read in the cap_pipe_read thread.
1650  * Iff the read is successful cap_pipe_read pushes an item onto
1651  * cap_pipe_done_q, otherwise an error is signaled. No data is passed in
1652  * the queues themselves (yet).
1653  *
1654  * We might want to move some of the cap_pipe_dispatch logic here so that
1655  * we can let cap_pipe_read run independently, queuing up multiple reads
1656  * for the main thread (and possibly get rid of cap_pipe_read_mtx).
1657  */
1658 static void *cap_pipe_read(void *arg)
1659 {
1660     pcap_options *pcap_opts;
1661     int bytes_read;
1662 #ifdef _WIN32
1663     BOOL res;
1664     DWORD b, last_err;
1665 #else /* _WIN32 */
1666     int b;
1667 #endif /* _WIN32 */
1668
1669     pcap_opts = (pcap_options *)arg;
1670     while (pcap_opts->cap_pipe_err == PIPOK) {
1671         g_async_queue_pop(pcap_opts->cap_pipe_pending_q); /* Wait for our cue (ahem) from the main thread */
1672         g_mutex_lock(pcap_opts->cap_pipe_read_mtx);
1673         bytes_read = 0;
1674         while (bytes_read < (int) pcap_opts->cap_pipe_bytes_to_read) {
1675 #ifdef _WIN32
1676             /* If we try to use read() on a named pipe on Windows with partial
1677              * data it appears to return EOF.
1678              */
1679             res = ReadFile(pcap_opts->cap_pipe_h, pcap_opts->cap_pipe_buf+bytes_read,
1680                            pcap_opts->cap_pipe_bytes_to_read - bytes_read,
1681                            &b, NULL);
1682
1683             bytes_read += b;
1684             if (!res) {
1685                 last_err = GetLastError();
1686                 if (last_err == ERROR_MORE_DATA) {
1687                     continue;
1688                 } else if (last_err == ERROR_HANDLE_EOF || last_err == ERROR_BROKEN_PIPE || last_err == ERROR_PIPE_NOT_CONNECTED) {
1689                     pcap_opts->cap_pipe_err = PIPEOF;
1690                     bytes_read = 0;
1691                     break;
1692                 }
1693                 pcap_opts->cap_pipe_err = PIPERR;
1694                 bytes_read = -1;
1695                 break;
1696             } else if (b == 0 && pcap_opts->cap_pipe_bytes_to_read > 0) {
1697                 pcap_opts->cap_pipe_err = PIPEOF;
1698                 bytes_read = 0;
1699                 break;
1700             }
1701 #else /* _WIN32 */
1702             b = read(pcap_opts->cap_pipe_fd, pcap_opts->cap_pipe_buf+bytes_read,
1703                      pcap_opts->cap_pipe_bytes_to_read - bytes_read);
1704             if (b <= 0) {
1705                 if (b == 0) {
1706                     pcap_opts->cap_pipe_err = PIPEOF;
1707                     bytes_read = 0;
1708                     break;
1709                 } else {
1710                     pcap_opts->cap_pipe_err = PIPERR;
1711                     bytes_read = -1;
1712                     break;
1713                 }
1714             } else {
1715                 bytes_read += b;
1716             }
1717 #endif /*_WIN32 */
1718         }
1719         pcap_opts->cap_pipe_bytes_read = bytes_read;
1720         if (pcap_opts->cap_pipe_bytes_read >= pcap_opts->cap_pipe_bytes_to_read) {
1721             g_async_queue_push(pcap_opts->cap_pipe_done_q, pcap_opts->cap_pipe_buf); /* Any non-NULL value will do */
1722         }
1723         g_mutex_unlock(pcap_opts->cap_pipe_read_mtx);
1724     }
1725     return NULL;
1726 }
1727 #endif
1728
1729 #if !defined(_WIN32) || defined(MUST_DO_SELECT)
1730 /* Provide select() functionality for a single file descriptor
1731  * on UNIX/POSIX. Windows uses cap_pipe_read via a thread.
1732  *
1733  * Returns the same values as select.
1734  */
1735 static int
1736 cap_pipe_select(int pipe_fd)
1737 {
1738     fd_set      rfds;
1739     struct timeval timeout;
1740
1741     FD_ZERO(&rfds);
1742     FD_SET(pipe_fd, &rfds);
1743
1744     timeout.tv_sec = PIPE_READ_TIMEOUT / 1000000;
1745     timeout.tv_usec = PIPE_READ_TIMEOUT % 1000000;
1746
1747     return select(pipe_fd+1, &rfds, NULL, NULL, &timeout);
1748 }
1749 #endif
1750
1751
1752 /* Mimic pcap_open_live() for pipe captures
1753
1754  * We check if "pipename" is "-" (stdin), a AF_UNIX socket, or a FIFO,
1755  * open it, and read the header.
1756  *
1757  * N.B. : we can't read the libpcap formats used in RedHat 6.1 or SuSE 6.3
1758  * because we can't seek on pipes (see wiretap/libpcap.c for details) */
1759 static void
1760 cap_pipe_open_live(char *pipename,
1761                    pcap_options *pcap_opts,
1762                    struct pcap_hdr *hdr,
1763                    char *errmsg, int errmsgl)
1764 {
1765 #ifndef _WIN32
1766     ws_statb64   pipe_stat;
1767     struct sockaddr_un sa;
1768     int          b;
1769     int          fd;
1770 #else /* _WIN32 */
1771 #if 1
1772     char *pncopy, *pos;
1773     wchar_t *err_str;
1774 #endif
1775 #endif
1776 #ifndef _WIN32
1777     int          sel_ret;
1778     unsigned int bytes_read;
1779 #endif
1780     guint32       magic = 0;
1781
1782 #ifndef _WIN32
1783     pcap_opts->cap_pipe_fd = -1;
1784 #else
1785     pcap_opts->cap_pipe_h = INVALID_HANDLE_VALUE;
1786 #endif
1787     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_open_live: %s", pipename);
1788
1789     /*
1790      * XXX - this blocks until a pcap per-file header has been written to
1791      * the pipe, so it could block indefinitely.
1792      */
1793     if (strcmp(pipename, "-") == 0) {
1794 #ifndef _WIN32
1795         fd = 0; /* read from stdin */
1796 #else /* _WIN32 */
1797         pcap_opts->cap_pipe_h = GetStdHandle(STD_INPUT_HANDLE);
1798 #endif  /* _WIN32 */
1799     } else {
1800 #ifndef _WIN32
1801         if (ws_stat64(pipename, &pipe_stat) < 0) {
1802             if (errno == ENOENT || errno == ENOTDIR)
1803                 pcap_opts->cap_pipe_err = PIPNEXIST;
1804             else {
1805                 g_snprintf(errmsg, errmsgl,
1806                            "The capture session could not be initiated "
1807                            "due to error getting information on pipe/socket: %s", g_strerror(errno));
1808                 pcap_opts->cap_pipe_err = PIPERR;
1809             }
1810             return;
1811         }
1812         if (S_ISFIFO(pipe_stat.st_mode)) {
1813             fd = ws_open(pipename, O_RDONLY | O_NONBLOCK, 0000 /* no creation so don't matter */);
1814             if (fd == -1) {
1815                 g_snprintf(errmsg, errmsgl,
1816                            "The capture session could not be initiated "
1817                            "due to error on pipe open: %s", g_strerror(errno));
1818                 pcap_opts->cap_pipe_err = PIPERR;
1819                 return;
1820             }
1821         } else if (S_ISSOCK(pipe_stat.st_mode)) {
1822             fd = socket(AF_UNIX, SOCK_STREAM, 0);
1823             if (fd == -1) {
1824                 g_snprintf(errmsg, errmsgl,
1825                            "The capture session could not be initiated "
1826                            "due to error on socket create: %s", g_strerror(errno));
1827                 pcap_opts->cap_pipe_err = PIPERR;
1828                 return;
1829             }
1830             sa.sun_family = AF_UNIX;
1831             /*
1832              * The Single UNIX Specification says:
1833              *
1834              *   The size of sun_path has intentionally been left undefined.
1835              *   This is because different implementations use different sizes.
1836              *   For example, 4.3 BSD uses a size of 108, and 4.4 BSD uses a size
1837              *   of 104. Since most implementations originate from BSD versions,
1838              *   the size is typically in the range 92 to 108.
1839              *
1840              *   Applications should not assume a particular length for sun_path
1841              *   or assume that it can hold {_POSIX_PATH_MAX} bytes (256).
1842              *
1843              * It also says
1844              *
1845              *   The <sys/un.h> header shall define the sockaddr_un structure,
1846              *   which shall include at least the following members:
1847              *
1848              *   sa_family_t  sun_family  Address family.
1849              *   char         sun_path[]  Socket pathname.
1850              *
1851              * so we assume that it's an array, with a specified size,
1852              * and that the size reflects the maximum path length.
1853              */
1854             if (g_strlcpy(sa.sun_path, pipename, sizeof sa.sun_path) > sizeof sa.sun_path) {
1855                 /* Path name too long */
1856                 g_snprintf(errmsg, errmsgl,
1857                            "The capture session coud not be initiated "
1858                            "due to error on socket connect: Path name too long");
1859                 pcap_opts->cap_pipe_err = PIPERR;
1860                 return;
1861             }
1862             b = connect(fd, (struct sockaddr *)&sa, sizeof sa);
1863             if (b == -1) {
1864                 g_snprintf(errmsg, errmsgl,
1865                            "The capture session coud not be initiated "
1866                            "due to error on socket connect: %s", g_strerror(errno));
1867                 pcap_opts->cap_pipe_err = PIPERR;
1868                 return;
1869             }
1870         } else {
1871             if (S_ISCHR(pipe_stat.st_mode)) {
1872                 /*
1873                  * Assume the user specified an interface on a system where
1874                  * interfaces are in /dev.  Pretend we haven't seen it.
1875                  */
1876                 pcap_opts->cap_pipe_err = PIPNEXIST;
1877             } else
1878             {
1879                 g_snprintf(errmsg, errmsgl,
1880                            "The capture session could not be initiated because\n"
1881                            "\"%s\" is neither an interface nor a socket nor a pipe", pipename);
1882                 pcap_opts->cap_pipe_err = PIPERR;
1883             }
1884             return;
1885         }
1886 #else /* _WIN32 */
1887 #define PIPE_STR "\\pipe\\"
1888         /* Under Windows, named pipes _must_ have the form
1889          * "\\<server>\pipe\<pipename>".  <server> may be "." for localhost.
1890          */
1891         pncopy = g_strdup(pipename);
1892         if ( (pos=strstr(pncopy, "\\\\")) == pncopy) {
1893             pos = strchr(pncopy + 3, '\\');
1894             if (pos && g_ascii_strncasecmp(pos, PIPE_STR, strlen(PIPE_STR)) != 0)
1895                 pos = NULL;
1896         }
1897
1898         g_free(pncopy);
1899
1900         if (!pos) {
1901             g_snprintf(errmsg, errmsgl,
1902                        "The capture session could not be initiated because\n"
1903                        "\"%s\" is neither an interface nor a pipe", pipename);
1904             pcap_opts->cap_pipe_err = PIPNEXIST;
1905             return;
1906         }
1907
1908         /* Wait for the pipe to appear */
1909         while (1) {
1910             pcap_opts->cap_pipe_h = CreateFile(utf_8to16(pipename), GENERIC_READ, 0, NULL,
1911                                                OPEN_EXISTING, 0, NULL);
1912
1913             if (pcap_opts->cap_pipe_h != INVALID_HANDLE_VALUE)
1914                 break;
1915
1916             if (GetLastError() != ERROR_PIPE_BUSY) {
1917                 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
1918                               NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL);
1919                 g_snprintf(errmsg, errmsgl,
1920                            "The capture session on \"%s\" could not be started "
1921                            "due to error on pipe open: %s (error %d)",
1922                            pipename, utf_16to8(err_str), GetLastError());
1923                 LocalFree(err_str);
1924                 pcap_opts->cap_pipe_err = PIPERR;
1925                 return;
1926             }
1927
1928             if (!WaitNamedPipe(utf_8to16(pipename), 30 * 1000)) {
1929                 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
1930                               NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL);
1931                 g_snprintf(errmsg, errmsgl,
1932                            "The capture session on \"%s\" timed out during "
1933                            "pipe open: %s (error %d)",
1934                            pipename, utf_16to8(err_str), GetLastError());
1935                 LocalFree(err_str);
1936                 pcap_opts->cap_pipe_err = PIPERR;
1937                 return;
1938             }
1939         }
1940 #endif /* _WIN32 */
1941     }
1942
1943     pcap_opts->from_cap_pipe = TRUE;
1944
1945 #ifndef _WIN32
1946     /* read the pcap header */
1947     bytes_read = 0;
1948     while (bytes_read < sizeof magic) {
1949         sel_ret = cap_pipe_select(fd);
1950         if (sel_ret < 0) {
1951             g_snprintf(errmsg, errmsgl,
1952                        "Unexpected error from select: %s", g_strerror(errno));
1953             goto error;
1954         } else if (sel_ret > 0) {
1955             b = read(fd, ((char *)&magic)+bytes_read, sizeof magic-bytes_read);
1956             if (b <= 0) {
1957                 if (b == 0)
1958                     g_snprintf(errmsg, errmsgl, "End of file on pipe magic during open");
1959                 else
1960                     g_snprintf(errmsg, errmsgl, "Error on pipe magic during open: %s",
1961                                g_strerror(errno));
1962                 goto error;
1963             }
1964             bytes_read += b;
1965         }
1966     }
1967 #else
1968     g_thread_create(&cap_pipe_read, pcap_opts, FALSE, NULL);
1969
1970     pcap_opts->cap_pipe_buf = (char *) &magic;
1971     pcap_opts->cap_pipe_bytes_read = 0;
1972     pcap_opts->cap_pipe_bytes_to_read = sizeof(magic);
1973     /* We don't have to worry about cap_pipe_read_mtx here */
1974     g_async_queue_push(pcap_opts->cap_pipe_pending_q, pcap_opts->cap_pipe_buf);
1975     g_async_queue_pop(pcap_opts->cap_pipe_done_q);
1976     if (pcap_opts->cap_pipe_bytes_read <= 0) {
1977         if (pcap_opts->cap_pipe_bytes_read == 0)
1978             g_snprintf(errmsg, errmsgl, "End of file on pipe magic during open");
1979         else
1980             g_snprintf(errmsg, errmsgl, "Error on pipe magic during open: %s",
1981                        g_strerror(errno));
1982         goto error;
1983     }
1984
1985 #endif
1986
1987     switch (magic) {
1988     case PCAP_MAGIC:
1989     case PCAP_NSEC_MAGIC:
1990         /* Host that wrote it has our byte order, and was running
1991            a program using either standard or ss990417 libpcap. */
1992         pcap_opts->cap_pipe_byte_swapped = FALSE;
1993         pcap_opts->cap_pipe_modified = FALSE;
1994         pcap_opts->ts_nsec = magic == PCAP_NSEC_MAGIC;
1995         break;
1996     case PCAP_MODIFIED_MAGIC:
1997         /* Host that wrote it has our byte order, but was running
1998            a program using either ss990915 or ss991029 libpcap. */
1999         pcap_opts->cap_pipe_byte_swapped = FALSE;
2000         pcap_opts->cap_pipe_modified = TRUE;
2001         break;
2002     case PCAP_SWAPPED_MAGIC:
2003     case PCAP_SWAPPED_NSEC_MAGIC:
2004         /* Host that wrote it has a byte order opposite to ours,
2005            and was running a program using either standard or
2006            ss990417 libpcap. */
2007         pcap_opts->cap_pipe_byte_swapped = TRUE;
2008         pcap_opts->cap_pipe_modified = FALSE;
2009         pcap_opts->ts_nsec = magic == PCAP_SWAPPED_NSEC_MAGIC;
2010         break;
2011     case PCAP_SWAPPED_MODIFIED_MAGIC:
2012         /* Host that wrote it out has a byte order opposite to
2013            ours, and was running a program using either ss990915
2014            or ss991029 libpcap. */
2015         pcap_opts->cap_pipe_byte_swapped = TRUE;
2016         pcap_opts->cap_pipe_modified = TRUE;
2017         break;
2018     default:
2019         /* Not a "libpcap" type we know about. */
2020         g_snprintf(errmsg, errmsgl, "Unrecognized libpcap format");
2021         goto error;
2022     }
2023
2024 #ifndef _WIN32
2025     /* Read the rest of the header */
2026     bytes_read = 0;
2027     while (bytes_read < sizeof(struct pcap_hdr)) {
2028         sel_ret = cap_pipe_select(fd);
2029         if (sel_ret < 0) {
2030             g_snprintf(errmsg, errmsgl,
2031                        "Unexpected error from select: %s", g_strerror(errno));
2032             goto error;
2033         } else if (sel_ret > 0) {
2034             b = read(fd, ((char *)hdr)+bytes_read,
2035                      sizeof(struct pcap_hdr) - bytes_read);
2036             if (b <= 0) {
2037                 if (b == 0)
2038                     g_snprintf(errmsg, errmsgl, "End of file on pipe header during open");
2039                 else
2040                     g_snprintf(errmsg, errmsgl, "Error on pipe header during open: %s",
2041                                g_strerror(errno));
2042                 goto error;
2043             }
2044             bytes_read += b;
2045         }
2046     }
2047 #else
2048     pcap_opts->cap_pipe_buf = (char *) hdr;
2049     pcap_opts->cap_pipe_bytes_read = 0;
2050     pcap_opts->cap_pipe_bytes_to_read = sizeof(struct pcap_hdr);
2051     g_async_queue_push(pcap_opts->cap_pipe_pending_q, pcap_opts->cap_pipe_buf);
2052     g_async_queue_pop(pcap_opts->cap_pipe_done_q);
2053     if (pcap_opts->cap_pipe_bytes_read <= 0) {
2054         if (pcap_opts->cap_pipe_bytes_read == 0)
2055             g_snprintf(errmsg, errmsgl, "End of file on pipe header during open");
2056         else
2057             g_snprintf(errmsg, errmsgl, "Error on pipe header header during open: %s",
2058                        g_strerror(errno));
2059         goto error;
2060     }
2061 #endif
2062
2063     if (pcap_opts->cap_pipe_byte_swapped) {
2064         /* Byte-swap the header fields about which we care. */
2065         hdr->version_major = BSWAP16(hdr->version_major);
2066         hdr->version_minor = BSWAP16(hdr->version_minor);
2067         hdr->snaplen = BSWAP32(hdr->snaplen);
2068         hdr->network = BSWAP32(hdr->network);
2069     }
2070     pcap_opts->linktype = hdr->network;
2071
2072     if (hdr->version_major < 2) {
2073         g_snprintf(errmsg, errmsgl, "Unable to read old libpcap format");
2074         goto error;
2075     }
2076
2077     pcap_opts->cap_pipe_state = STATE_EXPECT_REC_HDR;
2078     pcap_opts->cap_pipe_err = PIPOK;
2079 #ifndef _WIN32
2080     pcap_opts->cap_pipe_fd = fd;
2081 #endif
2082     return;
2083
2084 error:
2085     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_open_live: error %s", errmsg);
2086     pcap_opts->cap_pipe_err = PIPERR;
2087 #ifndef _WIN32
2088     ws_close(fd);
2089     pcap_opts->cap_pipe_fd = -1;
2090 #endif
2091     return;
2092
2093 }
2094
2095
2096 /* We read one record from the pipe, take care of byte order in the record
2097  * header, write the record to the capture file, and update capture statistics. */
2098 static int
2099 cap_pipe_dispatch(loop_data *ld, pcap_options *pcap_opts, guchar *data, char *errmsg, int errmsgl)
2100 {
2101     struct pcap_pkthdr phdr;
2102     enum { PD_REC_HDR_READ, PD_DATA_READ, PD_PIPE_EOF, PD_PIPE_ERR,
2103            PD_ERR } result;
2104 #ifdef _WIN32
2105 #if !GLIB_CHECK_VERSION(2,31,18)
2106     GTimeVal wait_time;
2107 #endif
2108     gpointer q_status;
2109 #else
2110     int b;
2111 #endif
2112 #ifdef _WIN32
2113     wchar_t *err_str;
2114 #endif
2115
2116 #ifdef LOG_CAPTURE_VERBOSE
2117     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_dispatch");
2118 #endif
2119
2120     switch (pcap_opts->cap_pipe_state) {
2121
2122     case STATE_EXPECT_REC_HDR:
2123 #ifdef _WIN32
2124         if (g_mutex_trylock(pcap_opts->cap_pipe_read_mtx)) {
2125 #endif
2126
2127             pcap_opts->cap_pipe_state = STATE_READ_REC_HDR;
2128             pcap_opts->cap_pipe_bytes_to_read = pcap_opts->cap_pipe_modified ?
2129                 sizeof(struct pcaprec_modified_hdr) : sizeof(struct pcaprec_hdr);
2130             pcap_opts->cap_pipe_bytes_read = 0;
2131
2132 #ifdef _WIN32
2133             pcap_opts->cap_pipe_buf = (char *) &pcap_opts->cap_pipe_rechdr;
2134             g_async_queue_push(pcap_opts->cap_pipe_pending_q, pcap_opts->cap_pipe_buf);
2135             g_mutex_unlock(pcap_opts->cap_pipe_read_mtx);
2136         }
2137 #endif
2138         /* Fall through */
2139
2140     case STATE_READ_REC_HDR:
2141 #ifndef _WIN32
2142         b = read(pcap_opts->cap_pipe_fd, ((char *)&pcap_opts->cap_pipe_rechdr)+pcap_opts->cap_pipe_bytes_read,
2143                  pcap_opts->cap_pipe_bytes_to_read - pcap_opts->cap_pipe_bytes_read);
2144         if (b <= 0) {
2145             if (b == 0)
2146                 result = PD_PIPE_EOF;
2147             else
2148                 result = PD_PIPE_ERR;
2149             break;
2150         }
2151         pcap_opts->cap_pipe_bytes_read += b;
2152 #else
2153 #if GLIB_CHECK_VERSION(2,31,18)
2154         q_status = g_async_queue_timeout_pop(pcap_opts->cap_pipe_done_q, PIPE_READ_TIMEOUT);
2155 #else
2156         g_get_current_time(&wait_time);
2157         g_time_val_add(&wait_time, PIPE_READ_TIMEOUT);
2158         q_status = g_async_queue_timed_pop(pcap_opts->cap_pipe_done_q, &wait_time);
2159 #endif
2160         if (pcap_opts->cap_pipe_err == PIPEOF) {
2161             result = PD_PIPE_EOF;
2162             break;
2163         } else if (pcap_opts->cap_pipe_err == PIPERR) {
2164             result = PD_PIPE_ERR;
2165             break;
2166         }
2167         if (!q_status) {
2168             return 0;
2169         }
2170 #endif
2171         if ((pcap_opts->cap_pipe_bytes_read) < pcap_opts->cap_pipe_bytes_to_read)
2172             return 0;
2173         result = PD_REC_HDR_READ;
2174         break;
2175
2176     case STATE_EXPECT_DATA:
2177 #ifdef _WIN32
2178         if (g_mutex_trylock(pcap_opts->cap_pipe_read_mtx)) {
2179 #endif
2180
2181             pcap_opts->cap_pipe_state = STATE_READ_DATA;
2182             pcap_opts->cap_pipe_bytes_to_read = pcap_opts->cap_pipe_rechdr.hdr.incl_len;
2183             pcap_opts->cap_pipe_bytes_read = 0;
2184
2185 #ifdef _WIN32
2186             pcap_opts->cap_pipe_buf = (char *) data;
2187             g_async_queue_push(pcap_opts->cap_pipe_pending_q, pcap_opts->cap_pipe_buf);
2188             g_mutex_unlock(pcap_opts->cap_pipe_read_mtx);
2189         }
2190 #endif
2191         /* Fall through */
2192
2193     case STATE_READ_DATA:
2194 #ifndef _WIN32
2195         b = read(pcap_opts->cap_pipe_fd, data+pcap_opts->cap_pipe_bytes_read,
2196                  pcap_opts->cap_pipe_bytes_to_read - pcap_opts->cap_pipe_bytes_read);
2197         if (b <= 0) {
2198             if (b == 0)
2199                 result = PD_PIPE_EOF;
2200             else
2201                 result = PD_PIPE_ERR;
2202             break;
2203         }
2204         pcap_opts->cap_pipe_bytes_read += b;
2205 #else
2206 #if GLIB_CHECK_VERSION(2,31,18)
2207         q_status = g_async_queue_timeout_pop(pcap_opts->cap_pipe_done_q, PIPE_READ_TIMEOUT);
2208 #else
2209         g_get_current_time(&wait_time);
2210         g_time_val_add(&wait_time, PIPE_READ_TIMEOUT);
2211         q_status = g_async_queue_timed_pop(pcap_opts->cap_pipe_done_q, &wait_time);
2212 #endif
2213         if (pcap_opts->cap_pipe_err == PIPEOF) {
2214             result = PD_PIPE_EOF;
2215             break;
2216         } else if (pcap_opts->cap_pipe_err == PIPERR) {
2217             result = PD_PIPE_ERR;
2218             break;
2219         }
2220         if (!q_status) {
2221             return 0;
2222         }
2223 #endif
2224         if ((pcap_opts->cap_pipe_bytes_read) < pcap_opts->cap_pipe_bytes_to_read)
2225             return 0;
2226         result = PD_DATA_READ;
2227         break;
2228
2229     default:
2230         g_snprintf(errmsg, errmsgl, "cap_pipe_dispatch: invalid state");
2231         result = PD_ERR;
2232
2233     } /* switch (pcap_opts->cap_pipe_state) */
2234
2235     /*
2236      * We've now read as much data as we were expecting, so process it.
2237      */
2238     switch (result) {
2239
2240     case PD_REC_HDR_READ:
2241         /* We've read the header. Take care of byte order. */
2242         cap_pipe_adjust_header(pcap_opts->cap_pipe_byte_swapped, &pcap_opts->cap_pipe_hdr,
2243                                &pcap_opts->cap_pipe_rechdr.hdr);
2244         if (pcap_opts->cap_pipe_rechdr.hdr.incl_len > WTAP_MAX_PACKET_SIZE) {
2245             g_snprintf(errmsg, errmsgl, "Frame %u too long (%d bytes)",
2246                        ld->packet_count+1, pcap_opts->cap_pipe_rechdr.hdr.incl_len);
2247             break;
2248         }
2249
2250         if (pcap_opts->cap_pipe_rechdr.hdr.incl_len) {
2251             pcap_opts->cap_pipe_state = STATE_EXPECT_DATA;
2252             return 0;
2253         }
2254         /* no data to read? fall through */
2255
2256     case PD_DATA_READ:
2257         /* Fill in a "struct pcap_pkthdr", and process the packet. */
2258         phdr.ts.tv_sec = pcap_opts->cap_pipe_rechdr.hdr.ts_sec;
2259         phdr.ts.tv_usec = pcap_opts->cap_pipe_rechdr.hdr.ts_usec;
2260         phdr.caplen = pcap_opts->cap_pipe_rechdr.hdr.incl_len;
2261         phdr.len = pcap_opts->cap_pipe_rechdr.hdr.orig_len;
2262
2263         if (use_threads) {
2264             capture_loop_queue_packet_cb((u_char *)pcap_opts, &phdr, data);
2265         } else {
2266             capture_loop_write_packet_cb((u_char *)pcap_opts, &phdr, data);
2267         }
2268         pcap_opts->cap_pipe_state = STATE_EXPECT_REC_HDR;
2269         return 1;
2270
2271     case PD_PIPE_EOF:
2272         pcap_opts->cap_pipe_err = PIPEOF;
2273         return -1;
2274
2275     case PD_PIPE_ERR:
2276 #ifdef _WIN32
2277         FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
2278                       NULL, GetLastError(), 0, (LPTSTR) &err_str, 0, NULL);
2279         g_snprintf(errmsg, errmsgl,
2280                    "Error reading from pipe: %s (error %d)",
2281                    utf_16to8(err_str), GetLastError());
2282         LocalFree(err_str);
2283 #else
2284         g_snprintf(errmsg, errmsgl, "Error reading from pipe: %s",
2285                    g_strerror(errno));
2286 #endif
2287         /* Fall through */
2288     case PD_ERR:
2289         break;
2290     }
2291
2292     pcap_opts->cap_pipe_err = PIPERR;
2293     /* Return here rather than inside the switch to prevent GCC warning */
2294     return -1;
2295 }
2296
2297
2298 /** Open the capture input file (pcap or capture pipe).
2299  *  Returns TRUE if it succeeds, FALSE otherwise. */
2300 static gboolean
2301 capture_loop_open_input(capture_options *capture_opts, loop_data *ld,
2302                         char *errmsg, size_t errmsg_len,
2303                         char *secondary_errmsg, size_t secondary_errmsg_len)
2304 {
2305     gchar             open_err_str[PCAP_ERRBUF_SIZE];
2306     gchar             *sync_msg_str;
2307     interface_options interface_opts;
2308     pcap_options      *pcap_opts;
2309     guint             i;
2310 #ifdef _WIN32
2311     int         err;
2312     gchar      *sync_secondary_msg_str;
2313     WORD        wVersionRequested;
2314     WSADATA     wsaData;
2315 #endif
2316
2317 /* XXX - opening Winsock on tshark? */
2318
2319     /* Initialize Windows Socket if we are in a WIN32 OS
2320        This needs to be done before querying the interface for network/netmask */
2321 #ifdef _WIN32
2322     /* XXX - do we really require 1.1 or earlier?
2323        Are there any versions that support only 2.0 or higher? */
2324     wVersionRequested = MAKEWORD(1, 1);
2325     err = WSAStartup(wVersionRequested, &wsaData);
2326     if (err != 0) {
2327         switch (err) {
2328
2329         case WSASYSNOTREADY:
2330             g_snprintf(errmsg, (gulong) errmsg_len,
2331                        "Couldn't initialize Windows Sockets: Network system not ready for network communication");
2332             break;
2333
2334         case WSAVERNOTSUPPORTED:
2335             g_snprintf(errmsg, (gulong) errmsg_len,
2336                        "Couldn't initialize Windows Sockets: Windows Sockets version %u.%u not supported",
2337                        LOBYTE(wVersionRequested), HIBYTE(wVersionRequested));
2338             break;
2339
2340         case WSAEINPROGRESS:
2341             g_snprintf(errmsg, (gulong) errmsg_len,
2342                        "Couldn't initialize Windows Sockets: Blocking operation is in progress");
2343             break;
2344
2345         case WSAEPROCLIM:
2346             g_snprintf(errmsg, (gulong) errmsg_len,
2347                        "Couldn't initialize Windows Sockets: Limit on the number of tasks supported by this WinSock implementation has been reached");
2348             break;
2349
2350         case WSAEFAULT:
2351             g_snprintf(errmsg, (gulong) errmsg_len,
2352                        "Couldn't initialize Windows Sockets: Bad pointer passed to WSAStartup");
2353             break;
2354
2355         default:
2356             g_snprintf(errmsg, (gulong) errmsg_len,
2357                        "Couldn't initialize Windows Sockets: error %d", err);
2358             break;
2359         }
2360         g_snprintf(secondary_errmsg, (gulong) secondary_errmsg_len, please_report);
2361         return FALSE;
2362     }
2363 #endif
2364     if ((use_threads == FALSE) &&
2365         (capture_opts->ifaces->len > 1)) {
2366         g_snprintf(errmsg, (gulong) errmsg_len,
2367                    "Using threads is required for capturing on multiple interfaces!");
2368         return FALSE;
2369     }
2370
2371     for (i = 0; i < capture_opts->ifaces->len; i++) {
2372         interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
2373         pcap_opts = (pcap_options *)g_malloc(sizeof (pcap_options));
2374         if (pcap_opts == NULL) {
2375             g_snprintf(errmsg, (gulong) errmsg_len,
2376                    "Could not allocate memory.");
2377             return FALSE;
2378         }
2379         pcap_opts->received = 0;
2380         pcap_opts->dropped = 0;
2381         pcap_opts->pcap_h = NULL;
2382 #ifdef MUST_DO_SELECT
2383         pcap_opts->pcap_fd = -1;
2384 #endif
2385         pcap_opts->pcap_err = FALSE;
2386         pcap_opts->interface_id = i;
2387         pcap_opts->tid = NULL;
2388         pcap_opts->snaplen = 0;
2389         pcap_opts->linktype = -1;
2390         pcap_opts->ts_nsec = FALSE;
2391         pcap_opts->from_cap_pipe = FALSE;
2392         memset(&pcap_opts->cap_pipe_hdr, 0, sizeof(struct pcap_hdr));
2393         memset(&pcap_opts->cap_pipe_rechdr, 0, sizeof(struct pcaprec_modified_hdr));
2394 #ifdef _WIN32
2395         pcap_opts->cap_pipe_h = INVALID_HANDLE_VALUE;
2396 #else
2397         pcap_opts->cap_pipe_fd = -1;
2398 #endif
2399         pcap_opts->cap_pipe_modified = FALSE;
2400         pcap_opts->cap_pipe_byte_swapped = FALSE;
2401 #ifdef _WIN32
2402         pcap_opts->cap_pipe_buf = NULL;
2403 #endif
2404         pcap_opts->cap_pipe_bytes_to_read = 0;
2405         pcap_opts->cap_pipe_bytes_read = 0;
2406         pcap_opts->cap_pipe_state = 0;
2407         pcap_opts->cap_pipe_err = PIPOK;
2408 #ifdef _WIN32
2409 #if GLIB_CHECK_VERSION(2,31,0)
2410         pcap_opts->cap_pipe_read_mtx = g_malloc(sizeof(GMutex));
2411         g_mutex_init(pcap_opts->cap_pipe_read_mtx);
2412 #else
2413         pcap_opts->cap_pipe_read_mtx = g_mutex_new();
2414 #endif
2415         pcap_opts->cap_pipe_pending_q = g_async_queue_new();
2416         pcap_opts->cap_pipe_done_q = g_async_queue_new();
2417 #endif
2418         g_array_append_val(ld->pcaps, pcap_opts);
2419
2420         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_open_input : %s", interface_opts.name);
2421         pcap_opts->pcap_h = open_capture_device(&interface_opts, &open_err_str);
2422
2423         if (pcap_opts->pcap_h != NULL) {
2424             /* we've opened "iface" as a network device */
2425 #ifdef _WIN32
2426             /* try to set the capture buffer size */
2427             if (interface_opts.buffer_size > 1 &&
2428                 pcap_setbuff(pcap_opts->pcap_h, interface_opts.buffer_size * 1024 * 1024) != 0) {
2429                 sync_secondary_msg_str = g_strdup_printf(
2430                     "The capture buffer size of %dMB seems to be too high for your machine,\n"
2431                     "the default of 1MB will be used.\n"
2432                     "\n"
2433                     "Nonetheless, the capture is started.\n",
2434                     interface_opts.buffer_size);
2435                 report_capture_error("Couldn't set the capture buffer size!",
2436                                      sync_secondary_msg_str);
2437                 g_free(sync_secondary_msg_str);
2438             }
2439 #endif
2440
2441 #if defined(HAVE_PCAP_SETSAMPLING)
2442             if (interface_opts.sampling_method != CAPTURE_SAMP_NONE) {
2443                 struct pcap_samp *samp;
2444
2445                 if ((samp = pcap_setsampling(pcap_opts->pcap_h)) != NULL) {
2446                     switch (interface_opts.sampling_method) {
2447                     case CAPTURE_SAMP_BY_COUNT:
2448                         samp->method = PCAP_SAMP_1_EVERY_N;
2449                         break;
2450
2451                     case CAPTURE_SAMP_BY_TIMER:
2452                         samp->method = PCAP_SAMP_FIRST_AFTER_N_MS;
2453                         break;
2454
2455                     default:
2456                         sync_msg_str = g_strdup_printf(
2457                             "Unknown sampling method %d specified,\n"
2458                             "continue without packet sampling",
2459                             interface_opts.sampling_method);
2460                         report_capture_error("Couldn't set the capture "
2461                                              "sampling", sync_msg_str);
2462                         g_free(sync_msg_str);
2463                     }
2464                     samp->value = interface_opts.sampling_param;
2465                 } else {
2466                     report_capture_error("Couldn't set the capture sampling",
2467                                          "Cannot get packet sampling data structure");
2468                 }
2469             }
2470 #endif
2471
2472             /* setting the data link type only works on real interfaces */
2473             if (!set_pcap_linktype(pcap_opts->pcap_h, interface_opts.linktype, interface_opts.name,
2474                                    errmsg, errmsg_len,
2475                                    secondary_errmsg, secondary_errmsg_len)) {
2476                 return FALSE;
2477             }
2478             pcap_opts->linktype = get_pcap_linktype(pcap_opts->pcap_h, interface_opts.name);
2479         } else {
2480             /* We couldn't open "iface" as a network device. */
2481             /* Try to open it as a pipe */
2482             cap_pipe_open_live(interface_opts.name, pcap_opts, &pcap_opts->cap_pipe_hdr, errmsg, (int) errmsg_len);
2483
2484 #ifndef _WIN32
2485             if (pcap_opts->cap_pipe_fd == -1) {
2486 #else
2487             if (pcap_opts->cap_pipe_h == INVALID_HANDLE_VALUE) {
2488 #endif
2489                 if (pcap_opts->cap_pipe_err == PIPNEXIST) {
2490                     /* Pipe doesn't exist, so output message for interface */
2491                     get_capture_device_open_failure_messages(open_err_str,
2492                                                              interface_opts.name,
2493                                                              errmsg,
2494                                                              errmsg_len,
2495                                                              secondary_errmsg,
2496                                                              secondary_errmsg_len);
2497                 }
2498                 /*
2499                  * Else pipe (or file) does exist and cap_pipe_open_live() has
2500                  * filled in errmsg
2501                  */
2502                 return FALSE;
2503             } else {
2504                 /* cap_pipe_open_live() succeeded; don't want
2505                    error message from pcap_open_live() */
2506                 open_err_str[0] = '\0';
2507             }
2508         }
2509
2510 /* XXX - will this work for tshark? */
2511 #ifdef MUST_DO_SELECT
2512         if (!pcap_opts->from_cap_pipe) {
2513 #ifdef HAVE_PCAP_GET_SELECTABLE_FD
2514             pcap_opts->pcap_fd = pcap_get_selectable_fd(pcap_opts->pcap_h);
2515 #else
2516             pcap_opts->pcap_fd = pcap_fileno(pcap_opts->pcap_h);
2517 #endif
2518         }
2519 #endif
2520
2521         /* Does "open_err_str" contain a non-empty string?  If so, "pcap_open_live()"
2522            returned a warning; print it, but keep capturing. */
2523         if (open_err_str[0] != '\0') {
2524             sync_msg_str = g_strdup_printf("%s.", open_err_str);
2525             report_capture_error(sync_msg_str, "");
2526             g_free(sync_msg_str);
2527         }
2528         capture_opts->ifaces = g_array_remove_index(capture_opts->ifaces, i);
2529         g_array_insert_val(capture_opts->ifaces, i, interface_opts);
2530     }
2531
2532     /* If not using libcap: we now can now set euid/egid to ruid/rgid         */
2533     /*  to remove any suid privileges.                                        */
2534     /* If using libcap: we can now remove NET_RAW and NET_ADMIN capabilities  */
2535     /*  (euid/egid have already previously been set to ruid/rgid.             */
2536     /* (See comment in main() for details)                                    */
2537 #ifndef HAVE_LIBCAP
2538     relinquish_special_privs_perm();
2539 #else
2540     relinquish_all_capabilities();
2541 #endif
2542     return TRUE;
2543 }
2544
2545 /* close the capture input file (pcap or capture pipe) */
2546 static void capture_loop_close_input(loop_data *ld)
2547 {
2548     guint i;
2549     pcap_options *pcap_opts;
2550
2551     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_close_input");
2552
2553     for (i = 0; i < ld->pcaps->len; i++) {
2554         pcap_opts = g_array_index(ld->pcaps, pcap_options *, i);
2555         /* if open, close the capture pipe "input file" */
2556 #ifndef _WIN32
2557         if (pcap_opts->cap_pipe_fd >= 0) {
2558             g_assert(pcap_opts->from_cap_pipe);
2559             ws_close(pcap_opts->cap_pipe_fd);
2560             pcap_opts->cap_pipe_fd = -1;
2561         }
2562 #else
2563         if (pcap_opts->cap_pipe_h != INVALID_HANDLE_VALUE) {
2564             CloseHandle(pcap_opts->cap_pipe_h);
2565             pcap_opts->cap_pipe_h = INVALID_HANDLE_VALUE;
2566         }
2567 #endif
2568         /* if open, close the pcap "input file" */
2569         if (pcap_opts->pcap_h != NULL) {
2570             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_close_input: closing %p", (void *)pcap_opts->pcap_h);
2571             pcap_close(pcap_opts->pcap_h);
2572             pcap_opts->pcap_h = NULL;
2573         }
2574     }
2575
2576     ld->go = FALSE;
2577
2578 #ifdef _WIN32
2579     /* Shut down windows sockets */
2580     WSACleanup();
2581 #endif
2582 }
2583
2584
2585 /* init the capture filter */
2586 static initfilter_status_t
2587 capture_loop_init_filter(pcap_t *pcap_h, gboolean from_cap_pipe,
2588                          const gchar * name, const gchar * cfilter)
2589 {
2590     struct bpf_program fcode;
2591
2592     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_init_filter: %s", cfilter);
2593
2594     /* capture filters only work on real interfaces */
2595     if (cfilter && !from_cap_pipe) {
2596         /* A capture filter was specified; set it up. */
2597         if (!compile_capture_filter(name, pcap_h, &fcode, cfilter)) {
2598             /* Treat this specially - our caller might try to compile this
2599                as a display filter and, if that succeeds, warn the user that
2600                the display and capture filter syntaxes are different. */
2601             return INITFILTER_BAD_FILTER;
2602         }
2603         if (pcap_setfilter(pcap_h, &fcode) < 0) {
2604 #ifdef HAVE_PCAP_FREECODE
2605             pcap_freecode(&fcode);
2606 #endif
2607             return INITFILTER_OTHER_ERROR;
2608         }
2609 #ifdef HAVE_PCAP_FREECODE
2610         pcap_freecode(&fcode);
2611 #endif
2612     }
2613
2614     return INITFILTER_NO_ERROR;
2615 }
2616
2617
2618 /* set up to write to the already-opened capture output file/files */
2619 static gboolean
2620 capture_loop_init_output(capture_options *capture_opts, loop_data *ld, char *errmsg, int errmsg_len)
2621 {
2622     int err;
2623     guint i;
2624     pcap_options *pcap_opts;
2625     interface_options interface_opts;
2626     gboolean successful;
2627
2628     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_init_output");
2629
2630     if ((capture_opts->use_pcapng == FALSE) &&
2631         (capture_opts->ifaces->len > 1)) {
2632         g_snprintf(errmsg, errmsg_len,
2633                    "Using PCAPNG is required for capturing on multiple interfaces! Use the -n option.");
2634         return FALSE;
2635     }
2636
2637     /* Set up to write to the capture file. */
2638     if (capture_opts->multi_files_on) {
2639         ld->pdh = ringbuf_init_libpcap_fdopen(&err);
2640     } else {
2641         ld->pdh = libpcap_fdopen(ld->save_file_fd, &err);
2642     }
2643     if (ld->pdh) {
2644         if (capture_opts->use_pcapng) {
2645             char appname[100];
2646             GString             *os_info_str;
2647
2648             os_info_str = g_string_new("");
2649             get_os_version_info(os_info_str);
2650
2651             g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_svnversion);
2652             successful = libpcap_write_session_header_block(ld->pdh,
2653                                 NULL,                        /* Comment*/
2654                                 NULL,                        /* HW*/
2655                                 os_info_str->str,            /* OS*/
2656                                 appname,
2657                                 -1,                          /* section_length */
2658                                 &ld->bytes_written,
2659                                 &err);
2660
2661             for (i = 0; successful && (i < capture_opts->ifaces->len); i++) {
2662                 interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
2663                 pcap_opts = g_array_index(ld->pcaps, pcap_options *, i);
2664                 if (pcap_opts->from_cap_pipe) {
2665                     pcap_opts->snaplen = pcap_opts->cap_pipe_hdr.snaplen;
2666                 } else {
2667                     pcap_opts->snaplen = pcap_snapshot(pcap_opts->pcap_h);
2668                 }
2669                 successful = libpcap_write_interface_description_block(global_ld.pdh,
2670                                                                        NULL,                       /* OPT_COMMENT       1 */
2671                                                                        interface_opts.name,        /* IDB_NAME          2 */
2672                                                                        interface_opts.descr,       /* IDB_DESCRIPTION   3 */
2673                                                                        interface_opts.cfilter,     /* IDB_FILTER       11 */
2674                                                                        os_info_str->str,           /* IDB_OS           12 */
2675                                                                        pcap_opts->linktype,
2676                                                                        pcap_opts->snaplen,
2677                                                                        &(global_ld.bytes_written),
2678                                                                        0,                          /* IDB_IF_SPEED      8 */
2679                                                                        pcap_opts->ts_nsec ? 9 : 6, /* IDB_TSRESOL       9 */
2680                                                                        &global_ld.err);
2681             }
2682
2683             g_string_free(os_info_str, TRUE);
2684
2685         } else {
2686             pcap_opts = g_array_index(ld->pcaps, pcap_options *, 0);
2687             if (pcap_opts->from_cap_pipe) {
2688                 pcap_opts->snaplen = pcap_opts->cap_pipe_hdr.snaplen;
2689             } else {
2690                 pcap_opts->snaplen = pcap_snapshot(pcap_opts->pcap_h);
2691             }
2692             successful = libpcap_write_file_header(ld->pdh, pcap_opts->linktype, pcap_opts->snaplen,
2693                                                    pcap_opts->ts_nsec, &ld->bytes_written, &err);
2694         }
2695         if (!successful) {
2696             fclose(ld->pdh);
2697             ld->pdh = NULL;
2698         }
2699     }
2700
2701     if (ld->pdh == NULL) {
2702         /* We couldn't set up to write to the capture file. */
2703         /* XXX - use cf_open_error_message from tshark instead? */
2704         switch (err) {
2705
2706         default:
2707             if (err < 0) {
2708                 g_snprintf(errmsg, errmsg_len,
2709                            "The file to which the capture would be"
2710                            " saved (\"%s\") could not be opened: Error %d.",
2711                            capture_opts->save_file, err);
2712             } else {
2713                 g_snprintf(errmsg, errmsg_len,
2714                            "The file to which the capture would be"
2715                            " saved (\"%s\") could not be opened: %s.",
2716                            capture_opts->save_file, g_strerror(err));
2717             }
2718             break;
2719         }
2720
2721         return FALSE;
2722     }
2723
2724     return TRUE;
2725 }
2726
2727 static gboolean
2728 capture_loop_close_output(capture_options *capture_opts, loop_data *ld, int *err_close)
2729 {
2730
2731     unsigned int i;
2732     pcap_options *pcap_opts;
2733     guint64 end_time = create_timestamp();
2734
2735     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_close_output");
2736
2737     if (capture_opts->multi_files_on) {
2738         return ringbuf_libpcap_dump_close(&capture_opts->save_file, err_close);
2739     } else {
2740         if (capture_opts->use_pcapng) {
2741             for (i = 0; i < global_ld.pcaps->len; i++) {
2742                 pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
2743                 if (!pcap_opts->from_cap_pipe) {
2744                     libpcap_write_interface_statistics_block(ld->pdh,
2745                                                              i,
2746                                                              pcap_opts->pcap_h,
2747                                                              &ld->bytes_written,
2748                                                              "Counters provided by libpcap",
2749                                                              start_time,
2750                                                              end_time,
2751                                                              err_close);
2752                 }
2753             }
2754         }
2755         return libpcap_dump_close(ld->pdh, err_close);
2756     }
2757 }
2758
2759 /* dispatch incoming packets (pcap or capture pipe)
2760  *
2761  * Waits for incoming packets to be available, and calls pcap_dispatch()
2762  * to cause them to be processed.
2763  *
2764  * Returns the number of packets which were processed.
2765  *
2766  * Times out (returning zero) after CAP_READ_TIMEOUT ms; this ensures that the
2767  * packet-batching behaviour does not cause packets to get held back
2768  * indefinitely.
2769  */
2770 static int
2771 capture_loop_dispatch(loop_data *ld,
2772                       char *errmsg, int errmsg_len, pcap_options *pcap_opts)
2773 {
2774     int       inpkts;
2775     gint      packet_count_before;
2776     guchar    pcap_data[WTAP_MAX_PACKET_SIZE];
2777 #ifndef _WIN32
2778     int       sel_ret;
2779 #endif
2780
2781     packet_count_before = ld->packet_count;
2782     if (pcap_opts->from_cap_pipe) {
2783         /* dispatch from capture pipe */
2784 #ifdef LOG_CAPTURE_VERBOSE
2785         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from capture pipe");
2786 #endif
2787 #ifndef _WIN32
2788         sel_ret = cap_pipe_select(pcap_opts->cap_pipe_fd);
2789         if (sel_ret <= 0) {
2790             if (sel_ret < 0 && errno != EINTR) {
2791                 g_snprintf(errmsg, errmsg_len,
2792                            "Unexpected error from select: %s", g_strerror(errno));
2793                 report_capture_error(errmsg, please_report);
2794                 ld->go = FALSE;
2795             }
2796         } else {
2797             /*
2798              * "select()" says we can read from the pipe without blocking
2799              */
2800 #endif
2801             inpkts = cap_pipe_dispatch(ld, pcap_opts, pcap_data, errmsg, errmsg_len);
2802             if (inpkts < 0) {
2803                 ld->go = FALSE;
2804             }
2805 #ifndef _WIN32
2806         }
2807 #endif
2808     }
2809     else
2810     {
2811         /* dispatch from pcap */
2812 #ifdef MUST_DO_SELECT
2813         /*
2814          * If we have "pcap_get_selectable_fd()", we use it to get the
2815          * descriptor on which to select; if that's -1, it means there
2816          * is no descriptor on which you can do a "select()" (perhaps
2817          * because you're capturing on a special device, and that device's
2818          * driver unfortunately doesn't support "select()", in which case
2819          * we don't do the select - which means it might not be possible
2820          * to stop a capture until a packet arrives.  If that's unacceptable,
2821          * plead with whoever supplies the software for that device to add
2822          * "select()" support, or upgrade to libpcap 0.8.1 or later, and
2823          * rebuild Wireshark or get a version built with libpcap 0.8.1 or
2824          * later, so it can use pcap_breakloop().
2825          */
2826 #ifdef LOG_CAPTURE_VERBOSE
2827         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_dispatch with select");
2828 #endif
2829         if (pcap_opts->pcap_fd != -1) {
2830             sel_ret = cap_pipe_select(pcap_opts->pcap_fd);
2831             if (sel_ret > 0) {
2832                 /*
2833                  * "select()" says we can read from it without blocking; go for
2834                  * it.
2835                  *
2836                  * We don't have pcap_breakloop(), so we only process one packet
2837                  * per pcap_dispatch() call, to allow a signal to stop the
2838                  * processing immediately, rather than processing all packets
2839                  * in a batch before quitting.
2840                  */
2841                 if (use_threads) {
2842                     inpkts = pcap_dispatch(pcap_opts->pcap_h, 1, capture_loop_queue_packet_cb, (u_char *)pcap_opts);
2843                 } else {
2844                     inpkts = pcap_dispatch(pcap_opts->pcap_h, 1, capture_loop_write_packet_cb, (u_char *)pcap_opts);
2845                 }
2846                 if (inpkts < 0) {
2847                     if (inpkts == -1) {
2848                         /* Error, rather than pcap_breakloop(). */
2849                         pcap_opts->pcap_err = TRUE;
2850                     }
2851                     ld->go = FALSE; /* error or pcap_breakloop() - stop capturing */
2852                 }
2853             } else {
2854                 if (sel_ret < 0 && errno != EINTR) {
2855                     g_snprintf(errmsg, errmsg_len,
2856                                "Unexpected error from select: %s", g_strerror(errno));
2857                     report_capture_error(errmsg, please_report);
2858                     ld->go = FALSE;
2859                 }
2860             }
2861         }
2862         else
2863 #endif /* MUST_DO_SELECT */
2864         {
2865             /* dispatch from pcap without select */
2866 #if 1
2867 #ifdef LOG_CAPTURE_VERBOSE
2868             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_dispatch");
2869 #endif
2870 #ifdef _WIN32
2871             /*
2872              * On Windows, we don't support asynchronously telling a process to
2873              * stop capturing; instead, we check for an indication on a pipe
2874              * after processing packets.  We therefore process only one packet
2875              * at a time, so that we can check the pipe after every packet.
2876              */
2877             if (use_threads) {
2878                 inpkts = pcap_dispatch(pcap_opts->pcap_h, 1, capture_loop_queue_packet_cb, (u_char *)pcap_opts);
2879             } else {
2880                 inpkts = pcap_dispatch(pcap_opts->pcap_h, 1, capture_loop_write_packet_cb, (u_char *)pcap_opts);
2881             }
2882 #else
2883             if (use_threads) {
2884                 inpkts = pcap_dispatch(pcap_opts->pcap_h, -1, capture_loop_queue_packet_cb, (u_char *)pcap_opts);
2885             } else {
2886                 inpkts = pcap_dispatch(pcap_opts->pcap_h, -1, capture_loop_write_packet_cb, (u_char *)pcap_opts);
2887             }
2888 #endif
2889             if (inpkts < 0) {
2890                 if (inpkts == -1) {
2891                     /* Error, rather than pcap_breakloop(). */
2892                     pcap_opts->pcap_err = TRUE;
2893                 }
2894                 ld->go = FALSE; /* error or pcap_breakloop() - stop capturing */
2895             }
2896 #else /* pcap_next_ex */
2897 #ifdef LOG_CAPTURE_VERBOSE
2898             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_next_ex");
2899 #endif
2900             /* XXX - this is currently unused, as there is some confusion with pcap_next_ex() vs. pcap_dispatch() */
2901
2902             /*
2903              * WinPcap's remote capturing feature doesn't work with pcap_dispatch(),
2904              * see http://wiki.wireshark.org/CaptureSetup_2fWinPcapRemote
2905              * This should be fixed in the WinPcap 4.0 alpha release.
2906              *
2907              * For reference, an example remote interface:
2908              * rpcap://[1.2.3.4]/\Device\NPF_{39993D68-7C9B-4439-A329-F2D888DA7C5C}
2909              */
2910
2911             /* emulate dispatch from pcap */
2912             {
2913                 int in;
2914                 struct pcap_pkthdr *pkt_header;
2915                 u_char *pkt_data;
2916
2917                 in = 0;
2918                 while(ld->go &&
2919                       (in = pcap_next_ex(pcap_opts->pcap_h, &pkt_header, &pkt_data)) == 1) {
2920                     if (use_threads) {
2921                         capture_loop_queue_packet_cb((u_char *)pcap_opts, pkt_header, pkt_data);
2922                     } else {
2923                         capture_loop_write_packet_cb((u_char *)pcap_opts, pkt_header, pkt_data);
2924                     }
2925                 }
2926
2927                 if(in < 0) {
2928                     pcap_opts->pcap_err = TRUE;
2929                     ld->go = FALSE;
2930                 }
2931             }
2932 #endif /* pcap_next_ex */
2933         }
2934     }
2935
2936 #ifdef LOG_CAPTURE_VERBOSE
2937     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: %d new packet%s", inpkts, plurality(inpkts, "", "s"));
2938 #endif
2939
2940     return ld->packet_count - packet_count_before;
2941 }
2942
2943 #ifdef _WIN32
2944 /* Isolate the Universally Unique Identifier from the interface.  Basically, we
2945  * want to grab only the characters between the '{' and '}' delimiters.
2946  *
2947  * Returns a GString that must be freed with g_string_free(). */
2948 static GString *
2949 isolate_uuid(const char *iface)
2950 {
2951     gchar *ptr;
2952     GString *gstr;
2953
2954     ptr = strchr(iface, '{');
2955     if (ptr == NULL)
2956         return g_string_new(iface);
2957     gstr = g_string_new(ptr + 1);
2958
2959     ptr = strchr(gstr->str, '}');
2960     if (ptr == NULL)
2961         return gstr;
2962
2963     gstr = g_string_truncate(gstr, ptr - gstr->str);
2964     return gstr;
2965 }
2966 #endif
2967
2968 /* open the output file (temporary/specified name/ringbuffer/named pipe/stdout) */
2969 /* Returns TRUE if the file opened successfully, FALSE otherwise. */
2970 static gboolean
2971 capture_loop_open_output(capture_options *capture_opts, int *save_file_fd,
2972                          char *errmsg, int errmsg_len)
2973 {
2974     char *tmpname;
2975     gchar *capfile_name;
2976     gchar *prefix;
2977     gboolean is_tempfile;
2978
2979     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_open_output: %s",
2980           (capture_opts->save_file) ? capture_opts->save_file : "(not specified)");
2981
2982     if (capture_opts->save_file != NULL) {
2983         /* We return to the caller while the capture is in progress.
2984          * Therefore we need to take a copy of save_file in
2985          * case the caller destroys it after we return.
2986          */
2987         capfile_name = g_strdup(capture_opts->save_file);
2988
2989         if (capture_opts->output_to_pipe == TRUE) { /* either "-" or named pipe */
2990             if (capture_opts->multi_files_on) {
2991                 /* ringbuffer is enabled; that doesn't work with standard output or a named pipe */
2992                 g_snprintf(errmsg, errmsg_len,
2993                            "Ring buffer requested, but capture is being written to standard output or to a named pipe.");
2994                 g_free(capfile_name);
2995                 return FALSE;
2996             }
2997             if (strcmp(capfile_name, "-") == 0) {
2998                 /* write to stdout */
2999                 *save_file_fd = 1;
3000 #ifdef _WIN32
3001                 /* set output pipe to binary mode to avoid Windows text-mode processing (eg: for CR/LF)  */
3002                 _setmode(1, O_BINARY);
3003 #endif
3004             }
3005         } /* if (...output_to_pipe ... */
3006
3007         else {
3008             if (capture_opts->multi_files_on) {
3009                 /* ringbuffer is enabled */
3010                 *save_file_fd = ringbuf_init(capfile_name,
3011                                              (capture_opts->has_ring_num_files) ? capture_opts->ring_num_files : 0,
3012                                              capture_opts->group_read_access);
3013
3014                 /* we need the ringbuf name */
3015                 if(*save_file_fd != -1) {
3016                     g_free(capfile_name);
3017                     capfile_name = g_strdup(ringbuf_current_filename());
3018                 }
3019             } else {
3020                 /* Try to open/create the specified file for use as a capture buffer. */
3021                 *save_file_fd = ws_open(capfile_name, O_RDWR|O_BINARY|O_TRUNC|O_CREAT,
3022                                         (capture_opts->group_read_access) ? 0640 : 0600);
3023             }
3024         }
3025         is_tempfile = FALSE;
3026     } else {
3027         /* Choose a random name for the temporary capture buffer */
3028         if (global_capture_opts.ifaces->len > 1) {
3029             prefix = g_strdup_printf("wireshark_%d_interfaces", global_capture_opts.ifaces->len);
3030         } else {
3031             gchar *basename;
3032 #ifdef _WIN32
3033             GString *iface;
3034             iface = isolate_uuid(g_array_index(global_capture_opts.ifaces, interface_options, 0).name);
3035             basename = g_path_get_basename(iface->str);
3036             g_string_free(iface, TRUE);
3037 #else
3038             basename = g_path_get_basename(g_array_index(global_capture_opts.ifaces, interface_options, 0).name);
3039 #endif
3040             prefix = g_strconcat("wireshark_", basename, NULL);
3041             g_free(basename);
3042         }
3043         *save_file_fd = create_tempfile(&tmpname, prefix);
3044         g_free(prefix);
3045         capfile_name = g_strdup(tmpname);
3046         is_tempfile = TRUE;
3047     }
3048
3049     /* did we fail to open the output file? */
3050     if (*save_file_fd == -1) {
3051         if (is_tempfile) {
3052             g_snprintf(errmsg, errmsg_len,
3053                        "The temporary file to which the capture would be saved (\"%s\") "
3054                        "could not be opened: %s.", capfile_name, g_strerror(errno));
3055         } else {
3056             if (capture_opts->multi_files_on) {
3057                 ringbuf_error_cleanup();
3058             }
3059
3060             g_snprintf(errmsg, errmsg_len,
3061                        "The file to which the capture would be saved (\"%s\") "
3062                        "could not be opened: %s.", capfile_name,
3063                        g_strerror(errno));
3064         }
3065         g_free(capfile_name);
3066         return FALSE;
3067     }
3068
3069     if(capture_opts->save_file != NULL) {
3070         g_free(capture_opts->save_file);
3071     }
3072     capture_opts->save_file = capfile_name;
3073     /* capture_opts.save_file is "g_free"ed later, which is equivalent to
3074        "g_free(capfile_name)". */
3075
3076     return TRUE;
3077 }
3078
3079
3080 /* Do the work of handling either the file size or file duration capture
3081    conditions being reached, and switching files or stopping. */
3082 static gboolean
3083 do_file_switch_or_stop(capture_options *capture_opts,
3084                        condition *cnd_autostop_files,
3085                        condition *cnd_autostop_size,
3086                        condition *cnd_file_duration)
3087 {
3088     guint i;
3089     pcap_options *pcap_opts;
3090     interface_options interface_opts;
3091     gboolean successful;
3092
3093     if (capture_opts->multi_files_on) {
3094         if (cnd_autostop_files != NULL &&
3095             cnd_eval(cnd_autostop_files, ++global_ld.autostop_files)) {
3096             /* no files left: stop here */
3097             global_ld.go = FALSE;
3098             return FALSE;
3099         }
3100
3101         /* Switch to the next ringbuffer file */
3102         if (ringbuf_switch_file(&global_ld.pdh, &capture_opts->save_file,
3103                                 &global_ld.save_file_fd, &global_ld.err)) {
3104
3105             /* File switch succeeded: reset the conditions */
3106             global_ld.bytes_written = 0;
3107             if (capture_opts->use_pcapng) {
3108                 char appname[100];
3109                 GString             *os_info_str;
3110
3111                 os_info_str = g_string_new("");
3112                 get_os_version_info(os_info_str);
3113
3114                 g_snprintf(appname, sizeof(appname), "Dumpcap " VERSION "%s", wireshark_svnversion);
3115                 successful = libpcap_write_session_header_block(global_ld.pdh,
3116                                 NULL,                        /* Comment */
3117                                 NULL,                        /* HW */
3118                                 os_info_str->str,            /* OS */
3119                                 appname,
3120                                                                 -1,                          /* section_length */
3121                                 &(global_ld.bytes_written),
3122                                 &global_ld.err);
3123
3124                 for (i = 0; successful && (i < capture_opts->ifaces->len); i++) {
3125                     interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
3126                     pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3127                     successful = libpcap_write_interface_description_block(global_ld.pdh,
3128                                                                            NULL,                       /* OPT_COMMENT       1 */
3129                                                                            interface_opts.name,        /* IDB_NAME          2 */
3130                                                                            interface_opts.descr,       /* IDB_DESCRIPTION   3 */
3131                                                                            interface_opts.cfilter,     /* IDB_FILTER       11 */
3132                                                                            os_info_str->str,           /* IDB_OS           12 */
3133                                                                            pcap_opts->linktype,
3134                                                                            pcap_opts->snaplen,
3135                                                                            &(global_ld.bytes_written),
3136                                                                            0,                          /* IDB_IF_SPEED      8 */
3137                                                                            pcap_opts->ts_nsec ? 9 : 6, /* IDB_TSRESOL       9 */
3138                                                                            &global_ld.err);
3139                 }
3140
3141                 g_string_free(os_info_str, TRUE);
3142
3143             } else {
3144                 pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, 0);
3145                 successful = libpcap_write_file_header(global_ld.pdh, pcap_opts->linktype, pcap_opts->snaplen,
3146                                                        pcap_opts->ts_nsec, &global_ld.bytes_written, &global_ld.err);
3147             }
3148             if (!successful) {
3149                 fclose(global_ld.pdh);
3150                 global_ld.pdh = NULL;
3151                 global_ld.go = FALSE;
3152                 return FALSE;
3153             }
3154             if (cnd_autostop_size)
3155                 cnd_reset(cnd_autostop_size);
3156             if (cnd_file_duration)
3157                 cnd_reset(cnd_file_duration);
3158             libpcap_dump_flush(global_ld.pdh, NULL);
3159             if (!quiet)
3160                 report_packet_count(global_ld.inpkts_to_sync_pipe);
3161             global_ld.inpkts_to_sync_pipe = 0;
3162             report_new_capture_file(capture_opts->save_file);
3163         } else {
3164             /* File switch failed: stop here */
3165             global_ld.go = FALSE;
3166             return FALSE;
3167         }
3168     } else {
3169         /* single file, stop now */
3170         global_ld.go = FALSE;
3171         return FALSE;
3172     }
3173     return TRUE;
3174 }
3175
3176 static void *
3177 pcap_read_handler(void* arg)
3178 {
3179     pcap_options *pcap_opts;
3180     char errmsg[MSG_MAX_LENGTH+1];
3181
3182     pcap_opts = (pcap_options *)arg;
3183
3184     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Started thread for interface %d.",
3185           pcap_opts->interface_id);
3186
3187     while (global_ld.go) {
3188         /* dispatch incoming packets */
3189         capture_loop_dispatch(&global_ld, errmsg, sizeof(errmsg), pcap_opts);
3190     }
3191     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Stopped thread for interface %d.",
3192           pcap_opts->interface_id);
3193     g_thread_exit(NULL);
3194     return (NULL);
3195 }
3196
3197 /* Do the low-level work of a capture.
3198    Returns TRUE if it succeeds, FALSE otherwise. */
3199 static gboolean
3200 capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct pcap_stat *stats)
3201 {
3202 #ifdef WIN32
3203     DWORD upd_time, cur_time;   /* GetTickCount() returns a "DWORD" (which is 'unsigned long') */
3204 #else
3205     struct timeval upd_time, cur_time;
3206 #endif
3207     int         err_close;
3208     int         inpkts;
3209     condition  *cnd_file_duration = NULL;
3210     condition  *cnd_autostop_files = NULL;
3211     condition  *cnd_autostop_size = NULL;
3212     condition  *cnd_autostop_duration = NULL;
3213     gboolean    write_ok;
3214     gboolean    close_ok;
3215     gboolean    cfilter_error = FALSE;
3216     char        errmsg[MSG_MAX_LENGTH+1];
3217     char        secondary_errmsg[MSG_MAX_LENGTH+1];
3218     pcap_options *pcap_opts;
3219     interface_options interface_opts;
3220     guint i, error_index = 0;
3221
3222     *errmsg           = '\0';
3223     *secondary_errmsg = '\0';
3224
3225     /* init the loop data */
3226     global_ld.go                  = TRUE;
3227     global_ld.packet_count        = 0;
3228 #ifdef SIGINFO
3229     global_ld.report_packet_count = FALSE;
3230 #endif
3231     if (capture_opts->has_autostop_packets)
3232         global_ld.packet_max      = capture_opts->autostop_packets;
3233     else
3234         global_ld.packet_max      = 0;        /* no limit */
3235     global_ld.inpkts_to_sync_pipe = 0;
3236     global_ld.err                 = 0;  /* no error seen yet */
3237     global_ld.pdh                 = NULL;
3238     global_ld.autostop_files      = 0;
3239     global_ld.save_file_fd        = -1;
3240
3241     /* We haven't yet gotten the capture statistics. */
3242     *stats_known      = FALSE;
3243
3244     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture loop starting ...");
3245     capture_opts_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, capture_opts);
3246
3247     /* open the "input file" from network interface or capture pipe */
3248     if (!capture_loop_open_input(capture_opts, &global_ld, errmsg, sizeof(errmsg),
3249                                  secondary_errmsg, sizeof(secondary_errmsg))) {
3250         goto error;
3251     }
3252     for (i = 0; i < capture_opts->ifaces->len; i++) {
3253         pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3254         interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
3255         /* init the input filter from the network interface (capture pipe will do nothing) */
3256         /*
3257          * When remote capturing WinPCap crashes when the capture filter
3258          * is NULL. This might be a bug in WPCap. Therefore we provide an empty
3259          * string.
3260          */
3261         switch (capture_loop_init_filter(pcap_opts->pcap_h, pcap_opts->from_cap_pipe,
3262                                          interface_opts.name,
3263                                          interface_opts.cfilter?interface_opts.cfilter:"")) {
3264
3265         case INITFILTER_NO_ERROR:
3266             break;
3267
3268         case INITFILTER_BAD_FILTER:
3269             cfilter_error = TRUE;
3270             error_index = i;
3271             g_snprintf(errmsg, sizeof(errmsg), "%s", pcap_geterr(pcap_opts->pcap_h));
3272             goto error;
3273
3274         case INITFILTER_OTHER_ERROR:
3275             g_snprintf(errmsg, sizeof(errmsg), "Can't install filter (%s).",
3276                        pcap_geterr(pcap_opts->pcap_h));
3277             g_snprintf(secondary_errmsg, sizeof(secondary_errmsg), "%s", please_report);
3278             goto error;
3279         }
3280     }
3281
3282     /* If we're supposed to write to a capture file, open it for output
3283        (temporary/specified name/ringbuffer) */
3284     if (capture_opts->saving_to_file) {
3285         if (!capture_loop_open_output(capture_opts, &global_ld.save_file_fd,
3286                                       errmsg, sizeof(errmsg))) {
3287             goto error;
3288         }
3289
3290         /* set up to write to the already-opened capture output file/files */
3291         if (!capture_loop_init_output(capture_opts, &global_ld, errmsg,
3292                                       sizeof(errmsg))) {
3293             goto error;
3294         }
3295
3296         /* XXX - capture SIGTERM and close the capture, in case we're on a
3297            Linux 2.0[.x] system and you have to explicitly close the capture
3298            stream in order to turn promiscuous mode off?  We need to do that
3299            in other places as well - and I don't think that works all the
3300            time in any case, due to libpcap bugs. */
3301
3302         /* Well, we should be able to start capturing.
3303
3304            Sync out the capture file, so the header makes it to the file system,
3305            and send a "capture started successfully and capture file created"
3306            message to our parent so that they'll open the capture file and
3307            update its windows to indicate that we have a live capture in
3308            progress. */
3309         libpcap_dump_flush(global_ld.pdh, NULL);
3310         report_new_capture_file(capture_opts->save_file);
3311     }
3312
3313     /* initialize capture stop (and alike) conditions */
3314     init_capture_stop_conditions();
3315     /* create stop conditions */
3316     if (capture_opts->has_autostop_filesize)
3317         cnd_autostop_size =
3318             cnd_new(CND_CLASS_CAPTURESIZE,(long)capture_opts->autostop_filesize * 1024);
3319     if (capture_opts->has_autostop_duration)
3320         cnd_autostop_duration =
3321             cnd_new(CND_CLASS_TIMEOUT,(gint32)capture_opts->autostop_duration);
3322
3323     if (capture_opts->multi_files_on) {
3324         if (capture_opts->has_file_duration)
3325             cnd_file_duration =
3326                 cnd_new(CND_CLASS_TIMEOUT, capture_opts->file_duration);
3327
3328         if (capture_opts->has_autostop_files)
3329             cnd_autostop_files =
3330                 cnd_new(CND_CLASS_CAPTURESIZE, capture_opts->autostop_files);
3331     }
3332
3333     /* init the time values */
3334 #ifdef WIN32
3335     upd_time = GetTickCount();
3336 #else
3337     gettimeofday(&upd_time, NULL);
3338 #endif
3339     start_time = create_timestamp();
3340     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture loop running!");
3341
3342     /* WOW, everything is prepared! */
3343     /* please fasten your seat belts, we will enter now the actual capture loop */
3344     if (use_threads) {
3345         pcap_queue = g_async_queue_new();
3346         pcap_queue_bytes = 0;
3347         pcap_queue_packets = 0;
3348         for (i = 0; i < global_ld.pcaps->len; i++) {
3349             pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3350 #if GLIB_CHECK_VERSION(2,31,0)
3351             /* XXX - Add an interface name here? */
3352             pcap_opts->tid = g_thread_new("Capture read", pcap_read_handler, pcap_opts);
3353 #else
3354             pcap_opts->tid = g_thread_create(pcap_read_handler, pcap_opts, TRUE, NULL);
3355 #endif
3356         }
3357     }
3358     while (global_ld.go) {
3359         /* dispatch incoming packets */
3360         if (use_threads) {
3361             pcap_queue_element *queue_element;
3362 #if GLIB_CHECK_VERSION(2,31,18)
3363
3364             queue_element = g_async_queue_timeout_pop_unlocked(pcap_queue, WRITER_THREAD_TIMEOUT);
3365 #else
3366             GTimeVal write_thread_time;
3367
3368             g_get_current_time(&write_thread_time);
3369             g_time_val_add(&write_thread_time, WRITER_THREAD_TIMEOUT);
3370             g_async_queue_lock(pcap_queue);
3371             queue_element = g_async_queue_timed_pop_unlocked(pcap_queue, &write_thread_time);
3372 #endif
3373             if (queue_element) {
3374                 pcap_queue_bytes -= queue_element->phdr.caplen;
3375                 pcap_queue_packets -= 1;
3376             }
3377             g_async_queue_unlock(pcap_queue);
3378             if (queue_element) {
3379                 g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3380                       "Dequeued a packet of length %d captured on interface %d.",
3381                       queue_element->phdr.caplen, queue_element->pcap_opts->interface_id);
3382
3383                 capture_loop_write_packet_cb((u_char *) queue_element->pcap_opts,
3384                                              &queue_element->phdr,
3385                                              queue_element->pd);
3386                 g_free(queue_element->pd);
3387                 g_free(queue_element);
3388                 inpkts = 1;
3389             } else {
3390                 inpkts = 0;
3391             }
3392         } else {
3393             pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, 0);
3394             inpkts = capture_loop_dispatch(&global_ld, errmsg,
3395                                            sizeof(errmsg), pcap_opts);
3396         }
3397 #ifdef SIGINFO
3398         /* Were we asked to print packet counts by the SIGINFO handler? */
3399         if (global_ld.report_packet_count) {
3400             fprintf(stderr, "%u packet%s captured\n", global_ld.packet_count,
3401                     plurality(global_ld.packet_count, "", "s"));
3402             global_ld.report_packet_count = FALSE;
3403         }
3404 #endif
3405
3406 #ifdef _WIN32
3407         /* any news from our parent (signal pipe)? -> just stop the capture */
3408         if (!signal_pipe_check_running()) {
3409             global_ld.go = FALSE;
3410         }
3411 #endif
3412
3413         if (inpkts > 0) {
3414             global_ld.inpkts_to_sync_pipe += inpkts;
3415
3416             /* check capture size condition */
3417             if (cnd_autostop_size != NULL &&
3418                 cnd_eval(cnd_autostop_size, (guint32)global_ld.bytes_written)) {
3419                 /* Capture size limit reached, do we have another file? */
3420                 if (!do_file_switch_or_stop(capture_opts, cnd_autostop_files,
3421                                             cnd_autostop_size, cnd_file_duration))
3422                     continue;
3423             } /* cnd_autostop_size */
3424             if (capture_opts->output_to_pipe) {
3425                 libpcap_dump_flush(global_ld.pdh, NULL);
3426             }
3427         } /* inpkts */
3428
3429         /* Only update once every 500ms so as not to overload slow displays.
3430          * This also prevents too much context-switching between the dumpcap
3431          * and wireshark processes.
3432          */
3433 #define DUMPCAP_UPD_TIME 500
3434
3435 #ifdef WIN32
3436         cur_time = GetTickCount();  /* Note: wraps to 0 if sys runs for 49.7 days */
3437         if ((cur_time - upd_time) > DUMPCAP_UPD_TIME) { /* wrap just causes an extra update */
3438 #else
3439         gettimeofday(&cur_time, NULL);
3440         if ((cur_time.tv_sec * 1000000 + cur_time.tv_usec) >
3441             (upd_time.tv_sec * 1000000 + upd_time.tv_usec + DUMPCAP_UPD_TIME*1000)) {
3442 #endif
3443
3444             upd_time = cur_time;
3445
3446 #if 0
3447             if (pcap_stats(pch, stats) >= 0) {
3448                 *stats_known = TRUE;
3449             }
3450 #endif
3451             /* Let the parent process know. */
3452             if (global_ld.inpkts_to_sync_pipe) {
3453                 /* do sync here */
3454                 libpcap_dump_flush(global_ld.pdh, NULL);
3455
3456                 /* Send our parent a message saying we've written out
3457                    "global_ld.inpkts_to_sync_pipe" packets to the capture file. */
3458                 if (!quiet)
3459                     report_packet_count(global_ld.inpkts_to_sync_pipe);
3460
3461                 global_ld.inpkts_to_sync_pipe = 0;
3462             }
3463
3464             /* check capture duration condition */
3465             if (cnd_autostop_duration != NULL && cnd_eval(cnd_autostop_duration)) {
3466                 /* The maximum capture time has elapsed; stop the capture. */
3467                 global_ld.go = FALSE;
3468                 continue;
3469             }
3470
3471             /* check capture file duration condition */
3472             if (cnd_file_duration != NULL && cnd_eval(cnd_file_duration)) {
3473                 /* duration limit reached, do we have another file? */
3474                 if (!do_file_switch_or_stop(capture_opts, cnd_autostop_files,
3475                                             cnd_autostop_size, cnd_file_duration))
3476                     continue;
3477             } /* cnd_file_duration */
3478         }
3479     }
3480
3481     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture loop stopping ...");
3482     if (use_threads) {
3483         pcap_queue_element *queue_element;
3484
3485         for (i = 0; i < global_ld.pcaps->len; i++) {
3486             pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3487             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Waiting for thread of interface %u...",
3488                   pcap_opts->interface_id);
3489             g_thread_join(pcap_opts->tid);
3490             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Thread of interface %u terminated.",
3491                   pcap_opts->interface_id);
3492         }
3493         while (1) {
3494             g_async_queue_lock(pcap_queue);
3495             queue_element = g_async_queue_try_pop_unlocked(pcap_queue);
3496             if (queue_element) {
3497                 pcap_queue_bytes -= queue_element->phdr.caplen;
3498                 pcap_queue_packets -= 1;
3499             }
3500             g_async_queue_unlock(pcap_queue);
3501             if (queue_element == NULL) {
3502                 break;
3503             }
3504             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3505                   "Dequeued a packet of length %d captured on interface %d.",
3506                   queue_element->phdr.caplen, queue_element->pcap_opts->interface_id);
3507             capture_loop_write_packet_cb((u_char *)queue_element->pcap_opts,
3508                                          &queue_element->phdr,
3509                                          queue_element->pd);
3510             g_free(queue_element->pd);
3511             g_free(queue_element);
3512             global_ld.inpkts_to_sync_pipe += 1;
3513             if (capture_opts->output_to_pipe) {
3514                 libpcap_dump_flush(global_ld.pdh, NULL);
3515             }
3516         }
3517     }
3518
3519
3520     /* delete stop conditions */
3521     if (cnd_file_duration != NULL)
3522         cnd_delete(cnd_file_duration);
3523     if (cnd_autostop_files != NULL)
3524         cnd_delete(cnd_autostop_files);
3525     if (cnd_autostop_size != NULL)
3526         cnd_delete(cnd_autostop_size);
3527     if (cnd_autostop_duration != NULL)
3528         cnd_delete(cnd_autostop_duration);
3529
3530     /* did we have a pcap (input) error? */
3531     for (i = 0; i < capture_opts->ifaces->len; i++) {
3532         pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3533         if (pcap_opts->pcap_err) {
3534             /* On Linux, if an interface goes down while you're capturing on it,
3535                you'll get a "recvfrom: Network is down" or
3536                "The interface went down" error (ENETDOWN).
3537                (At least you will if g_strerror() doesn't show a local translation
3538                of the error.)
3539
3540                On FreeBSD and OS X, if a network adapter disappears while
3541                you're capturing on it, you'll get a "read: Device not configured"
3542                error (ENXIO).  (See previous parenthetical note.)
3543
3544                On OpenBSD, you get "read: I/O error" (EIO) in the same case.
3545
3546                These should *not* be reported to the Wireshark developers. */
3547             char *cap_err_str;
3548
3549             cap_err_str = pcap_geterr(pcap_opts->pcap_h);
3550             if (strcmp(cap_err_str, "recvfrom: Network is down") == 0 ||
3551                 strcmp(cap_err_str, "The interface went down") == 0 ||
3552                 strcmp(cap_err_str, "read: Device not configured") == 0 ||
3553                 strcmp(cap_err_str, "read: I/O error") == 0 ||
3554                 strcmp(cap_err_str, "read error: PacketReceivePacket failed") == 0) {
3555                 report_capture_error("The network adapter on which the capture was being done "
3556                                      "is no longer running; the capture has stopped.",
3557                                      "");
3558             } else {
3559                 g_snprintf(errmsg, sizeof(errmsg), "Error while capturing packets: %s",
3560                            cap_err_str);
3561                 report_capture_error(errmsg, please_report);
3562             }
3563             break;
3564         } else if (pcap_opts->from_cap_pipe && pcap_opts->cap_pipe_err == PIPERR) {
3565             report_capture_error(errmsg, "");
3566             break;
3567         }
3568     }
3569     /* did we have an output error while capturing? */
3570     if (global_ld.err == 0) {
3571         write_ok = TRUE;
3572     } else {
3573         capture_loop_get_errmsg(errmsg, sizeof(errmsg), capture_opts->save_file,
3574                                 global_ld.err, FALSE);
3575         report_capture_error(errmsg, please_report);
3576         write_ok = FALSE;
3577     }
3578
3579     if (capture_opts->saving_to_file) {
3580         /* close the output file */
3581         close_ok = capture_loop_close_output(capture_opts, &global_ld, &err_close);
3582     } else
3583         close_ok = TRUE;
3584
3585     /* there might be packets not yet notified to the parent */
3586     /* (do this after closing the file, so all packets are already flushed) */
3587     if(global_ld.inpkts_to_sync_pipe) {
3588         if (!quiet)
3589             report_packet_count(global_ld.inpkts_to_sync_pipe);
3590         global_ld.inpkts_to_sync_pipe = 0;
3591     }
3592
3593     /* If we've displayed a message about a write error, there's no point
3594        in displaying another message about an error on close. */
3595     if (!close_ok && write_ok) {
3596         capture_loop_get_errmsg(errmsg, sizeof(errmsg), capture_opts->save_file, err_close,
3597                                 TRUE);
3598         report_capture_error(errmsg, "");
3599     }
3600
3601     /*
3602      * XXX We exhibit different behaviour between normal mode and sync mode
3603      * when the pipe is stdin and not already at EOF.  If we're a child, the
3604      * parent's stdin isn't closed, so if the user starts another capture,
3605      * cap_pipe_open_live() will very likely not see the expected magic bytes and
3606      * will say "Unrecognized libpcap format".  On the other hand, in normal
3607      * mode, cap_pipe_open_live() will say "End of file on pipe during open".
3608      */
3609
3610     report_capture_count(TRUE);
3611
3612     /* get packet drop statistics from pcap */
3613     for (i = 0; i < capture_opts->ifaces->len; i++) {
3614         guint32 received;
3615         guint32 dropped;
3616
3617         pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3618         interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
3619         received = pcap_opts->received;
3620         dropped = pcap_opts->dropped;
3621         if (pcap_opts->pcap_h != NULL) {
3622             g_assert(!pcap_opts->from_cap_pipe);
3623             /* Get the capture statistics, so we know how many packets were dropped. */
3624             if (pcap_stats(pcap_opts->pcap_h, stats) >= 0) {
3625                 *stats_known = TRUE;
3626                 /* Let the parent process know. */
3627                 dropped += stats->ps_drop;
3628             } else {
3629                 g_snprintf(errmsg, sizeof(errmsg),
3630                            "Can't get packet-drop statistics: %s",
3631                            pcap_geterr(pcap_opts->pcap_h));
3632                 report_capture_error(errmsg, please_report);
3633             }
3634         }
3635         report_packet_drops(received, dropped, interface_opts.name);
3636     }
3637
3638     /* close the input file (pcap or capture pipe) */
3639     capture_loop_close_input(&global_ld);
3640
3641     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture loop stopped!");
3642
3643     /* ok, if the write and the close were successful. */
3644     return write_ok && close_ok;
3645
3646 error:
3647     if (capture_opts->multi_files_on) {
3648         /* cleanup ringbuffer */
3649         ringbuf_error_cleanup();
3650     } else {
3651         /* We can't use the save file, and we have no FILE * for the stream
3652            to close in order to close it, so close the FD directly. */
3653         if (global_ld.save_file_fd != -1) {
3654             ws_close(global_ld.save_file_fd);
3655         }
3656
3657         /* We couldn't even start the capture, so get rid of the capture
3658            file. */
3659         if (capture_opts->save_file != NULL) {
3660             ws_unlink(capture_opts->save_file);
3661             g_free(capture_opts->save_file);
3662         }
3663     }
3664     capture_opts->save_file = NULL;
3665     if (cfilter_error)
3666         report_cfilter_error(capture_opts, error_index, errmsg);
3667     else
3668         report_capture_error(errmsg, secondary_errmsg);
3669
3670     /* close the input file (pcap or cap_pipe) */
3671     capture_loop_close_input(&global_ld);
3672
3673     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture loop stopped with error");
3674
3675     return FALSE;
3676 }
3677
3678
3679 static void capture_loop_stop(void)
3680 {
3681 #ifdef HAVE_PCAP_BREAKLOOP
3682     guint i;
3683     pcap_options *pcap_opts;
3684
3685     for (i = 0; i < global_ld.pcaps->len; i++) {
3686         pcap_opts = g_array_index(global_ld.pcaps, pcap_options *, i);
3687         if (pcap_opts->pcap_h != NULL)
3688             pcap_breakloop(pcap_opts->pcap_h);
3689     }
3690 #endif
3691     global_ld.go = FALSE;
3692 }
3693
3694
3695 static void
3696 capture_loop_get_errmsg(char *errmsg, int errmsglen, const char *fname,
3697                         int err, gboolean is_close)
3698 {
3699     switch (err) {
3700
3701     case ENOSPC:
3702         g_snprintf(errmsg, errmsglen,
3703                    "Not all the packets could be written to the file"
3704                    " to which the capture was being saved\n"
3705                    "(\"%s\") because there is no space left on the file system\n"
3706                    "on which that file resides.",
3707                    fname);
3708         break;
3709
3710 #ifdef EDQUOT
3711     case EDQUOT:
3712         g_snprintf(errmsg, errmsglen,
3713                    "Not all the packets could be written to the file"
3714                    " to which the capture was being saved\n"
3715                    "(\"%s\") because you are too close to, or over,"
3716                    " your disk quota\n"
3717                    "on the file system on which that file resides.",
3718                    fname);
3719         break;
3720 #endif
3721
3722     default:
3723         if (is_close) {
3724             g_snprintf(errmsg, errmsglen,
3725                        "The file to which the capture was being saved\n"
3726                        "(\"%s\") could not be closed: %s.",
3727                        fname, g_strerror(err));
3728         } else {
3729             g_snprintf(errmsg, errmsglen,
3730                        "An error occurred while writing to the file"
3731                        " to which the capture was being saved\n"
3732                        "(\"%s\"): %s.",
3733                        fname, g_strerror(err));
3734         }
3735         break;
3736     }
3737 }
3738
3739
3740 /* one packet was captured, process it */
3741 static void
3742 capture_loop_write_packet_cb(u_char *pcap_opts_p, const struct pcap_pkthdr *phdr,
3743                              const u_char *pd)
3744 {
3745     pcap_options *pcap_opts = (pcap_options *) (void *) pcap_opts_p;
3746     int err;
3747     guint ts_mul = pcap_opts->ts_nsec ? 1000000000 : 1000000;
3748
3749     /* We may be called multiple times from pcap_dispatch(); if we've set
3750        the "stop capturing" flag, ignore this packet, as we're not
3751        supposed to be saving any more packets. */
3752     if (!global_ld.go)
3753         return;
3754
3755     if (global_ld.pdh) {
3756         gboolean successful;
3757
3758         /* We're supposed to write the packet to a file; do so.
3759            If this fails, set "ld->go" to FALSE, to stop the capture, and set
3760            "ld->err" to the error. */
3761         if (global_capture_opts.use_pcapng) {
3762             successful = libpcap_write_enhanced_packet_block(global_ld.pdh, phdr, pcap_opts->interface_id, ts_mul, pd, &global_ld.bytes_written, &err);
3763         } else {
3764             successful = libpcap_write_packet(global_ld.pdh, phdr, pd, &global_ld.bytes_written, &err);
3765         }
3766         if (!successful) {
3767             global_ld.go = FALSE;
3768             global_ld.err = err;
3769         } else {
3770             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3771                   "Wrote a packet of length %d captured on interface %u.",
3772                    phdr->caplen, pcap_opts->interface_id);
3773             global_ld.packet_count++;
3774             pcap_opts->received++;
3775             /* if the user told us to stop after x packets, do we already have enough? */
3776             if ((global_ld.packet_max > 0) && (global_ld.packet_count >= global_ld.packet_max)) {
3777                 global_ld.go = FALSE;
3778             }
3779         }
3780     }
3781 }
3782
3783 /* one packet was captured, queue it */
3784 static void
3785 capture_loop_queue_packet_cb(u_char *pcap_opts_p, const struct pcap_pkthdr *phdr,
3786                              const u_char *pd)
3787 {
3788     pcap_options *pcap_opts = (pcap_options *) (void *) pcap_opts_p;
3789     pcap_queue_element *queue_element;
3790     gboolean limit_reached;
3791
3792     /* We may be called multiple times from pcap_dispatch(); if we've set
3793        the "stop capturing" flag, ignore this packet, as we're not
3794        supposed to be saving any more packets. */
3795     if (!global_ld.go)
3796         return;
3797
3798     queue_element = (pcap_queue_element *)g_malloc(sizeof(pcap_queue_element));
3799     if (queue_element == NULL) {
3800        pcap_opts->dropped++;
3801        return;
3802     }
3803     queue_element->pcap_opts = pcap_opts;
3804     queue_element->phdr = *phdr;
3805     queue_element->pd = (u_char *)g_malloc(phdr->caplen);
3806     if (queue_element->pd == NULL) {
3807         pcap_opts->dropped++;
3808         g_free(queue_element);
3809         return;
3810     }
3811     memcpy(queue_element->pd, pd, phdr->caplen);
3812     g_async_queue_lock(pcap_queue);
3813     if (((pcap_queue_byte_limit > 0) && (pcap_queue_bytes < pcap_queue_byte_limit)) &&
3814         ((pcap_queue_packet_limit > 0) && (pcap_queue_packets < pcap_queue_packet_limit))) {
3815         limit_reached = FALSE;
3816         g_async_queue_push_unlocked(pcap_queue, queue_element);
3817         pcap_queue_bytes += phdr->caplen;
3818         pcap_queue_packets += 1;
3819     } else {
3820         limit_reached = TRUE;
3821     }
3822     g_async_queue_unlock(pcap_queue);
3823     if (limit_reached) {
3824         pcap_opts->dropped++;
3825         g_free(queue_element->pd);
3826         g_free(queue_element);
3827         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3828               "Dropped a packet of length %d captured on interface %u.",
3829               phdr->caplen, pcap_opts->interface_id);
3830     } else {
3831         pcap_opts->received++;
3832         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3833               "Queued a packet of length %d captured on interface %u.",
3834               phdr->caplen, pcap_opts->interface_id);
3835     }
3836     /* I don't want to hold the mutex over the debug output. So the
3837        output may be wrong */
3838     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
3839           "Queue size is now %" G_GINT64_MODIFIER "d bytes (%" G_GINT64_MODIFIER "d packets)",
3840           pcap_queue_bytes, pcap_queue_packets);
3841 }
3842
3843 /* And now our feature presentation... [ fade to music ] */
3844 int
3845 main(int argc, char *argv[])
3846 {
3847     int                  opt;
3848     gboolean             arg_error = FALSE;
3849
3850 #ifdef _WIN32
3851     WSADATA              wsaData;
3852 #else
3853     struct sigaction action, oldaction;
3854 #endif
3855
3856     gboolean             start_capture = TRUE;
3857     gboolean             stats_known;
3858     struct pcap_stat     stats;
3859     GLogLevelFlags       log_flags;
3860     gboolean             list_interfaces = FALSE;
3861     gboolean             list_link_layer_types = FALSE;
3862 #ifdef HAVE_BPF_IMAGE
3863     gboolean             print_bpf_code = FALSE;
3864 #endif
3865     gboolean             machine_readable = FALSE;
3866     gboolean             print_statistics = FALSE;
3867     int                  status, run_once_args = 0;
3868     gint                 i;
3869     guint                j;
3870 #if defined(__APPLE__) && defined(__LP64__)
3871     struct utsname       osinfo;
3872 #endif
3873     GString             *str;
3874
3875 #ifdef _WIN32
3876     arg_list_utf_16to8(argc, argv);
3877 #endif /* _WIN32 */
3878
3879 #ifdef _WIN32
3880     /*
3881      * Initialize our DLL search path. MUST be called before LoadLibrary
3882      * or g_module_open.
3883      */
3884     ws_init_dll_search_path();
3885 #endif
3886
3887 #ifdef HAVE_PCAP_REMOTE
3888 #define OPTSTRING_A "A:"
3889 #define OPTSTRING_r "r"
3890 #define OPTSTRING_u "u"
3891 #else
3892 #define OPTSTRING_A ""
3893 #define OPTSTRING_r ""
3894 #define OPTSTRING_u ""
3895 #endif
3896
3897 #ifdef HAVE_PCAP_SETSAMPLING
3898 #define OPTSTRING_m "m:"
3899 #else
3900 #define OPTSTRING_m ""
3901 #endif
3902
3903 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
3904 #define OPTSTRING_B "B:"
3905 #else
3906 #define OPTSTRING_B ""
3907 #endif  /* _WIN32 or HAVE_PCAP_CREATE */
3908
3909 #ifdef HAVE_PCAP_CREATE
3910 #define OPTSTRING_I "I"
3911 #else
3912 #define OPTSTRING_I ""
3913 #endif
3914
3915 #ifdef HAVE_BPF_IMAGE
3916 #define OPTSTRING_d "d"
3917 #else
3918 #define OPTSTRING_d ""
3919 #endif
3920
3921 #define OPTSTRING "a:" OPTSTRING_A "b:" OPTSTRING_B "c:" OPTSTRING_d "Df:ghi:" OPTSTRING_I "L" OPTSTRING_m "MnpPq" OPTSTRING_r "Ss:t" OPTSTRING_u "vw:y:Z:"
3922
3923 #ifdef DEBUG_CHILD_DUMPCAP
3924     if ((debug_log = ws_fopen("dumpcap_debug_log.tmp","w")) == NULL) {
3925         fprintf (stderr, "Unable to open debug log file !\n");
3926         exit (1);
3927     }
3928 #endif
3929
3930 #if defined(__APPLE__) && defined(__LP64__)
3931     /*
3932      * Is this Mac OS X 10.6.0, 10.6.1, 10.6.3, or 10.6.4?  If so, we need
3933      * a bug workaround - timeouts less than 1 second don't work with libpcap
3934      * in 64-bit code.  (The bug was introduced in 10.6, fixed in 10.6.2,
3935      * re-introduced in 10.6.3, not fixed in 10.6.4, and fixed in 10.6.5.
3936      * The problem is extremely unlikely to be reintroduced in a future
3937      * release.)
3938      */
3939     if (uname(&osinfo) == 0) {
3940         /*
3941          * Mac OS X 10.x uses Darwin {x+4}.0.0.  Mac OS X 10.x.y uses Darwin
3942          * {x+4}.y.0 (except that 10.6.1 appears to have a uname version
3943          * number of 10.0.0, not 10.1.0 - go figure).
3944          */
3945         if (strcmp(osinfo.release, "10.0.0") == 0 ||    /* 10.6, 10.6.1 */
3946             strcmp(osinfo.release, "10.3.0") == 0 ||    /* 10.6.3 */
3947             strcmp(osinfo.release, "10.4.0") == 0)              /* 10.6.4 */
3948             need_timeout_workaround = TRUE;
3949     }
3950 #endif
3951
3952     /*
3953      * Determine if dumpcap is being requested to run in a special
3954      * capture_child mode by going thru the command line args to see if
3955      * a -Z is present. (-Z is a hidden option).
3956      *
3957      * The primary result of running in capture_child mode is that
3958      * all messages sent out on stderr are in a special type/len/string
3959      * format to allow message processing by type.  These messages include
3960      * error messages if dumpcap fails to start the operation it was
3961      * requested to do, as well as various "status" messages which are sent
3962      * when an actual capture is in progress, and a "success" message sent
3963      * if dumpcap was requested to perform an operation other than a
3964      * capture.
3965      *
3966      * Capture_child mode would normally be requested by a parent process
3967      * which invokes dumpcap and obtains dumpcap stderr output via a pipe
3968      * to which dumpcap stderr has been redirected.  It might also have
3969      * another pipe to obtain dumpcap stdout output; for operations other
3970      * than a capture, that information is formatted specially for easier
3971      * parsing by the parent process.
3972      *
3973      * Capture_child mode needs to be determined immediately upon
3974      * startup so that any messages generated by dumpcap in this mode
3975      * (eg: during initialization) will be formatted properly.
3976      */
3977
3978     for (i=1; i<argc; i++) {
3979         if (strcmp("-Z", argv[i]) == 0) {
3980             capture_child = TRUE;
3981             machine_readable = TRUE;  /* request machine-readable output */
3982 #ifdef _WIN32
3983             /* set output pipe to binary mode, to avoid ugly text conversions */
3984             _setmode(2, O_BINARY);
3985 #endif
3986         }
3987     }
3988
3989     /* The default_log_handler will use stdout, which makes trouble in   */
3990     /* capture child mode, as it uses stdout for it's sync_pipe.         */
3991     /* So: the filtering is done in the console_log_handler and not here.*/
3992     /* We set the log handlers right up front to make sure that any log  */
3993     /* messages when running as child will be sent back to the parent    */
3994     /* with the correct format.                                          */
3995
3996     log_flags =
3997         G_LOG_LEVEL_ERROR|
3998         G_LOG_LEVEL_CRITICAL|
3999         G_LOG_LEVEL_WARNING|
4000         G_LOG_LEVEL_MESSAGE|
4001         G_LOG_LEVEL_INFO|
4002         G_LOG_LEVEL_DEBUG|
4003         G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION;
4004
4005     g_log_set_handler(NULL,
4006                       log_flags,
4007                       console_log_handler, NULL /* user_data */);
4008     g_log_set_handler(LOG_DOMAIN_MAIN,
4009                       log_flags,
4010                       console_log_handler, NULL /* user_data */);
4011     g_log_set_handler(LOG_DOMAIN_CAPTURE,
4012                       log_flags,
4013                       console_log_handler, NULL /* user_data */);
4014     g_log_set_handler(LOG_DOMAIN_CAPTURE_CHILD,
4015                       log_flags,
4016                       console_log_handler, NULL /* user_data */);
4017
4018     /* Initialize the pcaps list */
4019     global_ld.pcaps = g_array_new(FALSE, FALSE, sizeof(pcap_options *));
4020
4021 #if !GLIB_CHECK_VERSION(2,31,0)
4022     /* Initialize the thread system */
4023     g_thread_init(NULL);
4024 #endif
4025
4026 #ifdef _WIN32
4027     /* Load wpcap if possible. Do this before collecting the run-time version information */
4028     load_wpcap();
4029
4030     /* ... and also load the packet.dll from wpcap */
4031     /* XXX - currently not required, may change later. */
4032     /*wpcap_packet_load();*/
4033
4034     /* Start windows sockets */
4035     WSAStartup( MAKEWORD( 1, 1 ), &wsaData );
4036
4037     /* Set handler for Ctrl+C key */
4038     SetConsoleCtrlHandler(capture_cleanup_handler, TRUE);
4039 #else
4040     /* Catch SIGINT and SIGTERM and, if we get either of them, clean up
4041        and exit. */
4042     action.sa_handler = capture_cleanup_handler;
4043     /*
4044      * Arrange that system calls not get restarted, because when
4045      * our signal handler returns we don't want to restart
4046      * a call that was waiting for packets to arrive.
4047      */
4048     action.sa_flags = 0;
4049     sigemptyset(&action.sa_mask);
4050     sigaction(SIGTERM, &action, NULL);
4051     sigaction(SIGINT, &action, NULL);
4052     sigaction(SIGPIPE, &action, NULL);
4053     sigaction(SIGHUP, NULL, &oldaction);
4054     if (oldaction.sa_handler == SIG_DFL)
4055         sigaction(SIGHUP, &action, NULL);
4056
4057 #ifdef SIGINFO
4058     /* Catch SIGINFO and, if we get it and we're capturing in
4059        quiet mode, report the number of packets we've captured. */
4060     action.sa_handler = report_counts_siginfo;
4061     action.sa_flags = SA_RESTART;
4062     sigemptyset(&action.sa_mask);
4063     sigaction(SIGINFO, &action, NULL);
4064 #endif /* SIGINFO */
4065 #endif  /* _WIN32 */
4066
4067     /* ----------------------------------------------------------------- */
4068     /* Privilege and capability handling                                 */
4069     /* Cases:                                                            */
4070     /* 1. Running not as root or suid root; no special capabilities.     */
4071     /*    Action: none                                                   */
4072     /*                                                                   */
4073     /* 2. Running logged in as root (euid=0; ruid=0); Not using libcap.  */
4074     /*    Action: none                                                   */
4075     /*                                                                   */
4076     /* 3. Running logged in as root (euid=0; ruid=0). Using libcap.      */
4077     /*    Action:                                                        */
4078     /*      - Near start of program: Enable NET_RAW and NET_ADMIN        */
4079     /*        capabilities; Drop all other capabilities;                 */
4080     /*      - If not -w  (ie: doing -S or -D, etc) run to completion;    */
4081     /*        else: after  pcap_open_live() in capture_loop_open_input() */
4082     /*         drop all capabilities (NET_RAW and NET_ADMIN);            */
4083     /*         (Note: this means that the process, although logged in    */
4084     /*          as root, does not have various permissions such as the   */
4085     /*          ability to bypass file access permissions).              */
4086     /*      XXX: Should we just leave capabilities alone in this case    */
4087     /*          so that user gets expected effect that root can do       */
4088     /*          anything ??                                              */
4089     /*                                                                   */
4090     /* 4. Running as suid root (euid=0, ruid=n); Not using libcap.       */
4091     /*    Action:                                                        */
4092     /*      - If not -w  (ie: doing -S or -D, etc) run to completion;    */
4093     /*        else: after  pcap_open_live() in capture_loop_open_input() */
4094     /*         drop suid root (set euid=ruid).(ie: keep suid until after */
4095     /*         pcap_open_live).                                          */
4096     /*                                                                   */
4097     /* 5. Running as suid root (euid=0, ruid=n); Using libcap.           */
4098     /*    Action:                                                        */
4099     /*      - Near start of program: Enable NET_RAW and NET_ADMIN        */
4100     /*        capabilities; Drop all other capabilities;                 */
4101     /*        Drop suid privileges (euid=ruid);                          */
4102     /*      - If not -w  (ie: doing -S or -D, etc) run to completion;    */
4103     /*        else: after  pcap_open_live() in capture_loop_open_input() */
4104     /*         drop all capabilities (NET_RAW and NET_ADMIN).            */
4105     /*                                                                   */
4106     /*      XXX: For some Linux versions/distros with capabilities       */
4107     /*        a 'normal' process with any capabilities cannot be         */
4108     /*        'killed' (signaled) from another (same uid) non-privileged */
4109     /*        process.                                                   */
4110     /*        For example: If (non-suid) Wireshark forks a               */
4111     /*        child suid dumpcap which acts as described here (case 5),  */
4112     /*        Wireshark will be unable to kill (signal) the child        */
4113     /*        dumpcap process until the capabilities have been dropped   */
4114     /*        (after pcap_open_live()).                                  */
4115     /*        This behaviour will apparently be changed in the kernel    */
4116     /*        to allow the kill (signal) in this case.                   */
4117     /*        See the following for details:                             */
4118     /*           http://www.mail-archive.com/  [wrapped]                 */
4119     /*             linux-security-module@vger.kernel.org/msg02913.html   */
4120     /*                                                                   */
4121     /*        It is therefore conceivable that if dumpcap somehow hangs  */
4122     /*        in pcap_open_live or before that wireshark will not        */
4123     /*        be able to stop dumpcap using a signal (INT, TERM, etc).   */
4124     /*        In this case, exiting wireshark will kill the child        */
4125     /*        dumpcap process.                                           */
4126     /*                                                                   */
4127     /* 6. Not root or suid root; Running with NET_RAW & NET_ADMIN        */
4128     /*     capabilities; Using libcap.  Note: capset cmd (which see)     */
4129     /*     used to assign capabilities to file.                          */
4130     /*    Action:                                                        */
4131     /*      - If not -w  (ie: doing -S or -D, etc) run to completion;    */
4132     /*        else: after  pcap_open_live() in capture_loop_open_input() */
4133     /*         drop all capabilities (NET_RAW and NET_ADMIN)             */
4134     /*                                                                   */
4135     /* ToDo: -S (stats) should drop privileges/capabilities when no      */
4136     /*       longer required (similar to capture).                       */
4137     /*                                                                   */
4138     /* ----------------------------------------------------------------- */
4139
4140     init_process_policies();
4141
4142 #ifdef HAVE_LIBCAP
4143     /* If 'started with special privileges' (and using libcap)  */
4144     /*   Set to keep only NET_RAW and NET_ADMIN capabilities;   */
4145     /*   Set euid/egid = ruid/rgid to remove suid privileges    */
4146     relinquish_privs_except_capture();
4147 #endif
4148
4149     /* Set the initial values in the capture options. This might be overwritten
4150        by the command line parameters. */
4151     capture_opts_init(&global_capture_opts, NULL);
4152
4153     /* We always save to a file - if no file was specified, we save to a
4154        temporary file. */
4155     global_capture_opts.saving_to_file      = TRUE;
4156     global_capture_opts.has_ring_num_files  = TRUE;
4157
4158     /* Now get our args */
4159     while ((opt = getopt(argc, argv, OPTSTRING)) != -1) {
4160         switch (opt) {
4161         case 'h':        /* Print help and exit */
4162             print_usage(TRUE);
4163             exit_main(0);
4164             break;
4165         case 'v':        /* Show version and exit */
4166         {
4167             GString             *comp_info_str;
4168             GString             *runtime_info_str;
4169             /* Assemble the compile-time version information string */
4170             comp_info_str = g_string_new("Compiled ");
4171             get_compiled_version_info(comp_info_str, NULL, NULL);
4172
4173             /* Assemble the run-time version information string */
4174             runtime_info_str = g_string_new("Running ");
4175             get_runtime_version_info(runtime_info_str, NULL);
4176             show_version(comp_info_str, runtime_info_str);
4177             g_string_free(comp_info_str, TRUE);
4178             g_string_free(runtime_info_str, TRUE);
4179             exit_main(0);
4180             break;
4181         }
4182         /*** capture option specific ***/
4183         case 'a':        /* autostop criteria */
4184         case 'b':        /* Ringbuffer option */
4185         case 'c':        /* Capture x packets */
4186         case 'f':        /* capture filter */
4187         case 'i':        /* Use interface x */
4188         case 'n':        /* Use pcapng format */
4189         case 'p':        /* Don't capture in promiscuous mode */
4190         case 'P':        /* Use pcap format */
4191         case 's':        /* Set the snapshot (capture) length */
4192         case 'w':        /* Write to capture file x */
4193         case 'g':        /* enable group read accesson file(s) */
4194         case 'y':        /* Set the pcap data link type */
4195 #ifdef HAVE_PCAP_REMOTE
4196         case 'u':        /* Use UDP for data transfer */
4197         case 'r':        /* Capture own RPCAP traffic too */
4198         case 'A':        /* Authentication */
4199 #endif
4200 #ifdef HAVE_PCAP_SETSAMPLING
4201         case 'm':        /* Sampling */
4202 #endif
4203 #if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
4204         case 'B':        /* Buffer size */
4205 #endif /* _WIN32 or HAVE_PCAP_CREATE */
4206 #ifdef HAVE_PCAP_CREATE
4207         case 'I':        /* Monitor mode */
4208 #endif
4209             status = capture_opts_add_opt(&global_capture_opts, opt, optarg, &start_capture);
4210             if(status != 0) {
4211                 exit_main(status);
4212             }
4213             break;
4214             /*** hidden option: Wireshark child mode (using binary output messages) ***/
4215         case 'Z':
4216             capture_child = TRUE;
4217 #ifdef _WIN32
4218             /* set output pipe to binary mode, to avoid ugly text conversions */
4219             _setmode(2, O_BINARY);
4220             /*
4221              * optarg = the control ID, aka the PPID, currently used for the
4222              * signal pipe name.
4223              */
4224             if (strcmp(optarg, SIGNAL_PIPE_CTRL_ID_NONE) != 0) {
4225                 sig_pipe_name = g_strdup_printf(SIGNAL_PIPE_FORMAT, optarg);
4226                 sig_pipe_handle = CreateFile(utf_8to16(sig_pipe_name),
4227                                              GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
4228
4229                 if (sig_pipe_handle == INVALID_HANDLE_VALUE) {
4230                     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
4231                           "Signal pipe: Unable to open %s.  Dead parent?",
4232                           sig_pipe_name);
4233                     exit_main(1);
4234                 }
4235             }
4236 #endif
4237             break;
4238
4239         case 'q':        /* Quiet */
4240             quiet = TRUE;
4241             break;
4242         case 't':
4243             use_threads = TRUE;
4244             break;
4245             /*** all non capture option specific ***/
4246         case 'D':        /* Print a list of capture devices and exit */
4247             list_interfaces = TRUE;
4248             run_once_args++;
4249             break;
4250         case 'L':        /* Print list of link-layer types and exit */
4251             list_link_layer_types = TRUE;
4252             run_once_args++;
4253             break;
4254 #ifdef HAVE_BPF_IMAGE
4255         case 'd':        /* Print BPF code for capture filter and exit */
4256             print_bpf_code = TRUE;
4257             run_once_args++;
4258             break;
4259 #endif
4260         case 'S':        /* Print interface statistics once a second */
4261             print_statistics = TRUE;
4262             run_once_args++;
4263             break;
4264         case 'M':        /* For -D, -L, and -S, print machine-readable output */
4265             machine_readable = TRUE;
4266             break;
4267         default:
4268             cmdarg_err("Invalid Option: %s", argv[optind-1]);
4269             /* FALLTHROUGH */
4270         case '?':        /* Bad flag - print usage message */
4271             arg_error = TRUE;
4272             break;
4273         }
4274     }
4275     if (!arg_error) {
4276         argc -= optind;
4277         argv += optind;
4278         if (argc >= 1) {
4279             /* user specified file name as regular command-line argument */
4280             /* XXX - use it as the capture file name (or something else)? */
4281             argc--;
4282             argv++;
4283         }
4284         if (argc != 0) {
4285             /*
4286              * Extra command line arguments were specified; complain.
4287              * XXX - interpret as capture filter, as tcpdump and tshark do?
4288              */
4289             cmdarg_err("Invalid argument: %s", argv[0]);
4290             arg_error = TRUE;
4291         }
4292     }
4293
4294     if (arg_error) {
4295         print_usage(FALSE);
4296         exit_main(1);
4297     }
4298
4299     if (run_once_args > 1) {
4300         cmdarg_err("Only one of -D, -L, or -S may be supplied.");
4301         exit_main(1);
4302     } else if (run_once_args == 1) {
4303         /* We're supposed to print some information, rather than
4304            to capture traffic; did they specify a ring buffer option? */
4305         if (global_capture_opts.multi_files_on) {
4306             cmdarg_err("Ring buffer requested, but a capture isn't being done.");
4307             exit_main(1);
4308         }
4309     } else {
4310         /* We're supposed to capture traffic; */
4311         /* Are we capturing on multiple interface? If so, use threads and pcapng. */
4312         if (global_capture_opts.ifaces->len > 1) {
4313             use_threads = TRUE;
4314             global_capture_opts.use_pcapng = TRUE;
4315         }
4316         /* Was the ring buffer option specified and, if so, does it make sense? */
4317         if (global_capture_opts.multi_files_on) {
4318             /* Ring buffer works only under certain conditions:
4319                a) ring buffer does not work with temporary files;
4320                b) it makes no sense to enable the ring buffer if the maximum
4321                file size is set to "infinite". */
4322             if (global_capture_opts.save_file == NULL) {
4323                 cmdarg_err("Ring buffer requested, but capture isn't being saved to a permanent file.");
4324                 global_capture_opts.multi_files_on = FALSE;
4325             }
4326             if (!global_capture_opts.has_autostop_filesize && !global_capture_opts.has_file_duration) {
4327                 cmdarg_err("Ring buffer requested, but no maximum capture file size or duration were specified.");
4328 #if 0
4329                 /* XXX - this must be redesigned as the conditions changed */
4330                 global_capture_opts.multi_files_on = FALSE;
4331 #endif
4332             }
4333         }
4334     }
4335
4336     /*
4337      * "-D" requires no interface to be selected; it's supposed to list
4338      * all interfaces.
4339      */
4340     if (list_interfaces) {
4341         /* Get the list of interfaces */
4342         GList       *if_list;
4343         int         err;
4344         gchar       *err_str;
4345
4346         if_list = capture_interface_list(&err, &err_str);
4347         if (if_list == NULL) {
4348             switch (err) {
4349             case CANT_GET_INTERFACE_LIST:
4350             case DONT_HAVE_PCAP:
4351                 cmdarg_err("%s", err_str);
4352                 g_free(err_str);
4353                 exit_main(2);
4354                 break;
4355
4356             case NO_INTERFACES_FOUND:
4357                 /*
4358                  * If we're being run by another program, just give them
4359                  * an empty list of interfaces, don't report this as
4360                  * an error; that lets them decide whether to report
4361                  * this as an error or not.
4362                  */
4363                 if (!machine_readable) {
4364                     cmdarg_err("There are no interfaces on which a capture can be done");
4365                     exit_main(2);
4366                 }
4367                 break;
4368             }
4369         }
4370
4371         if (machine_readable)      /* tab-separated values to stdout */
4372             print_machine_readable_interfaces(if_list);
4373         else
4374             capture_opts_print_interfaces(if_list);
4375         free_interface_list(if_list);
4376         exit_main(0);
4377     }
4378
4379     /*
4380      * "-S" requires no interface to be selected; it gives statistics
4381      * for all interfaces.
4382      */
4383     if (print_statistics) {
4384         status = print_statistics_loop(machine_readable);
4385         exit_main(status);
4386     }
4387
4388     /*
4389      * "-L", "-d", and capturing act on a particular interface, so we have to
4390      * have an interface; if none was specified, pick a default.
4391      */
4392     if (capture_opts_trim_iface(&global_capture_opts, NULL) == FALSE) {
4393         /* cmdarg_err() already called .... */
4394         exit_main(1);
4395     }
4396
4397     /* Let the user know what interfaces were chosen. */
4398     /* get_interface_descriptive_name() is not available! */
4399     if (capture_child) {
4400         for (j = 0; j < global_capture_opts.ifaces->len; j++) {
4401             interface_options interface_opts;
4402
4403             interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, j);
4404             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Interface: %s\n",
4405                   interface_opts.name);
4406         }
4407     } else {
4408         str = g_string_new("");
4409 #ifdef _WIN32
4410         if (global_capture_opts.ifaces->len < 2) {
4411 #else
4412         if (global_capture_opts.ifaces->len < 4) {
4413 #endif
4414             for (j = 0; j < global_capture_opts.ifaces->len; j++) {
4415                 interface_options interface_opts;
4416
4417                 interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, j);
4418                 if (j > 0) {
4419                     if (global_capture_opts.ifaces->len > 2) {
4420                         g_string_append_printf(str, ",");
4421                     }
4422                     g_string_append_printf(str, " ");
4423                     if (j == global_capture_opts.ifaces->len - 1) {
4424                         g_string_append_printf(str, "and ");
4425                     }
4426                 }
4427                 g_string_append_printf(str, "%s", interface_opts.name);
4428             }
4429         } else {
4430             g_string_append_printf(str, "%u interfaces", global_capture_opts.ifaces->len);
4431         }
4432         fprintf(stderr, "Capturing on %s\n", str->str);
4433         g_string_free(str, TRUE);
4434     }
4435
4436     if (list_link_layer_types) {
4437         /* Get the list of link-layer types for the capture device. */
4438         if_capabilities_t *caps;
4439         gchar *err_str;
4440         guint i;
4441
4442         for (i = 0; i < global_capture_opts.ifaces->len; i++) {
4443             interface_options interface_opts;
4444
4445             interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
4446             caps = get_if_capabilities(interface_opts.name,
4447                                        interface_opts.monitor_mode, &err_str);
4448             if (caps == NULL) {
4449                 cmdarg_err("The capabilities of the capture device \"%s\" could not be obtained (%s).\n"
4450                            "Please check to make sure you have sufficient permissions, and that\n"
4451                            "you have the proper interface or pipe specified.", interface_opts.name, err_str);
4452                 g_free(err_str);
4453                 exit_main(2);
4454             }
4455             if (caps->data_link_types == NULL) {
4456                 cmdarg_err("The capture device \"%s\" has no data link types.", interface_opts.name);
4457                 exit_main(2);
4458             }
4459             if (machine_readable)      /* tab-separated values to stdout */
4460                 /* XXX: We need to change the format and adopt consumers */
4461                 print_machine_readable_if_capabilities(caps);
4462             else
4463                 /* XXX: We might want to print also the interface name */
4464                 capture_opts_print_if_capabilities(caps, interface_opts.name,
4465                                                    interface_opts.monitor_mode);
4466             free_if_capabilities(caps);
4467         }
4468         exit_main(0);
4469     }
4470
4471     /* We're supposed to do a capture, or print the BPF code for a filter.
4472        Process the snapshot length, as that affects the generated BPF code. */
4473     capture_opts_trim_snaplen(&global_capture_opts, MIN_PACKET_SIZE);
4474
4475 #ifdef HAVE_BPF_IMAGE
4476     if (print_bpf_code) {
4477         show_filter_code(&global_capture_opts);
4478         exit_main(0);
4479     }
4480 #endif
4481
4482     /* We're supposed to do a capture.  Process the ring buffer arguments. */
4483     capture_opts_trim_ring_num_files(&global_capture_opts);
4484
4485     /* Now start the capture. */
4486
4487     if(capture_loop_start(&global_capture_opts, &stats_known, &stats) == TRUE) {
4488         /* capture ok */
4489         exit_main(0);
4490     } else {
4491         /* capture failed */
4492         exit_main(1);
4493     }
4494     return 0; /* never here, make compiler happy */
4495 }
4496
4497
4498 static void
4499 console_log_handler(const char *log_domain, GLogLevelFlags log_level,
4500                     const char *message, gpointer user_data _U_)
4501 {
4502     time_t curr;
4503     struct tm  *today;
4504     const char *level;
4505     gchar      *msg;
4506
4507     /* ignore log message, if log_level isn't interesting */
4508     if( !(log_level & G_LOG_LEVEL_MASK & ~(G_LOG_LEVEL_DEBUG|G_LOG_LEVEL_INFO))) {
4509 #if !defined(DEBUG_DUMPCAP) && !defined(DEBUG_CHILD_DUMPCAP)
4510         return;
4511 #endif
4512     }
4513
4514     /* create a "timestamp" */
4515     time(&curr);
4516     today = localtime(&curr);
4517
4518     switch(log_level & G_LOG_LEVEL_MASK) {
4519     case G_LOG_LEVEL_ERROR:
4520         level = "Err ";
4521         break;
4522     case G_LOG_LEVEL_CRITICAL:
4523         level = "Crit";
4524         break;
4525     case G_LOG_LEVEL_WARNING:
4526         level = "Warn";
4527         break;
4528     case G_LOG_LEVEL_MESSAGE:
4529         level = "Msg ";
4530         break;
4531     case G_LOG_LEVEL_INFO:
4532         level = "Info";
4533         break;
4534     case G_LOG_LEVEL_DEBUG:
4535         level = "Dbg ";
4536         break;
4537     default:
4538         fprintf(stderr, "unknown log_level %u\n", log_level);
4539         level = NULL;
4540         g_assert_not_reached();
4541     }
4542
4543     /* Generate the output message                                  */
4544     if(log_level & G_LOG_LEVEL_MESSAGE) {
4545         /* normal user messages without additional infos */
4546         msg =  g_strdup_printf("%s\n", message);
4547     } else {
4548         /* info/debug messages with additional infos */
4549         msg = g_strdup_printf("%02u:%02u:%02u %8s %s %s\n",
4550                               today->tm_hour, today->tm_min, today->tm_sec,
4551                               log_domain != NULL ? log_domain : "",
4552                               level, message);
4553     }
4554
4555     /* DEBUG & INFO msgs (if we're debugging today)                 */
4556 #if defined(DEBUG_DUMPCAP) || defined(DEBUG_CHILD_DUMPCAP)
4557     if( !(log_level & G_LOG_LEVEL_MASK & ~(G_LOG_LEVEL_DEBUG|G_LOG_LEVEL_INFO))) {
4558 #ifdef DEBUG_DUMPCAP
4559         fprintf(stderr, "%s", msg);
4560         fflush(stderr);
4561 #endif
4562 #ifdef DEBUG_CHILD_DUMPCAP
4563         fprintf(debug_log, "%s", msg);
4564         fflush(debug_log);
4565 #endif
4566         g_free(msg);
4567         return;
4568     }
4569 #endif
4570
4571     /* ERROR, CRITICAL, WARNING, MESSAGE messages goto stderr or    */
4572     /*  to parent especially formatted if dumpcap running as child. */
4573     if (capture_child) {
4574         sync_pipe_errmsg_to_parent(2, msg, "");
4575     } else {
4576         fprintf(stderr, "%s", msg);
4577         fflush(stderr);
4578     }
4579     g_free(msg);
4580 }
4581
4582
4583 /****************************************************************************************************************/
4584 /* indication report routines */
4585
4586
4587 static void
4588 report_packet_count(int packet_count)
4589 {
4590     char tmp[SP_DECISIZE+1+1];
4591     static int count = 0;
4592
4593     if(capture_child) {
4594         g_snprintf(tmp, sizeof(tmp), "%d", packet_count);
4595         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Packets: %s", tmp);
4596         pipe_write_block(2, SP_PACKET_COUNT, tmp);
4597     } else {
4598         count += packet_count;
4599         fprintf(stderr, "\rPackets: %u ", count);
4600         /* stderr could be line buffered */
4601         fflush(stderr);
4602     }
4603 }
4604
4605 static void
4606 report_new_capture_file(const char *filename)
4607 {
4608     if(capture_child) {
4609         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "File: %s", filename);
4610         pipe_write_block(2, SP_FILE, filename);
4611     } else {
4612 #ifdef SIGINFO
4613         /*
4614          * Prevent a SIGINFO handler from writing to the standard error
4615          * while we're doing so; instead, have it just set a flag telling
4616          * us to print that information when we're done.
4617          */
4618         infodelay = TRUE;
4619 #endif /* SIGINFO */
4620         fprintf(stderr, "File: %s\n", filename);
4621         /* stderr could be line buffered */
4622         fflush(stderr);
4623
4624 #ifdef SIGINFO
4625         /*
4626          * Allow SIGINFO handlers to write.
4627          */
4628         infodelay = FALSE;
4629
4630         /*
4631          * If a SIGINFO handler asked us to write out capture counts, do so.
4632          */
4633         if (infoprint)
4634           report_counts_for_siginfo();
4635 #endif /* SIGINFO */
4636     }
4637 }
4638
4639 static void
4640 report_cfilter_error(capture_options *capture_opts, guint i, const char *errmsg)
4641 {
4642     interface_options interface_opts;
4643     char tmp[MSG_MAX_LENGTH+1+6];
4644
4645     if (i < capture_opts->ifaces->len) {
4646         if (capture_child) {
4647             g_snprintf(tmp, sizeof(tmp), "%u:%s", i, errmsg);
4648             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "Capture filter error: %s", errmsg);
4649             pipe_write_block(2, SP_BAD_FILTER, tmp);
4650         } else {
4651             /*
4652              * clopts_step_invalid_capfilter in test/suite-clopts.sh MUST match
4653              * the error message below.
4654              */
4655             interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
4656             cmdarg_err(
4657               "Invalid capture filter: \"%s\" for interface %s!\n"
4658               "\n"
4659               "That string isn't a valid capture filter (%s).\n"
4660               "See the User's Guide for a description of the capture filter syntax.",
4661               interface_opts.cfilter, interface_opts.name, errmsg);
4662         }
4663     }
4664 }
4665
4666 static void
4667 report_capture_error(const char *error_msg, const char *secondary_error_msg)
4668 {
4669     if(capture_child) {
4670         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
4671             "Primary Error: %s", error_msg);
4672         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
4673             "Secondary Error: %s", secondary_error_msg);
4674         sync_pipe_errmsg_to_parent(2, error_msg, secondary_error_msg);
4675     } else {
4676         cmdarg_err("%s", error_msg);
4677         if (secondary_error_msg[0] != '\0')
4678           cmdarg_err_cont("%s", secondary_error_msg);
4679     }
4680 }
4681
4682 static void
4683 report_packet_drops(guint32 received, guint32 drops, gchar *name)
4684 {
4685     char tmp[SP_DECISIZE+1+1];
4686
4687     g_snprintf(tmp, sizeof(tmp), "%u", drops);
4688
4689     if(capture_child) {
4690         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
4691             "Packets received/dropped on interface %s: %u/%u",
4692             name, received, drops);
4693         /* XXX: Need to provide interface id, changes to consumers required. */
4694         pipe_write_block(2, SP_DROPS, tmp);
4695     } else {
4696         fprintf(stderr,
4697             "Packets received/dropped on interface %s: %u/%u (%.1f%%)\n",
4698             name, received, drops,
4699             received ? 100.0 * received / (received + drops) : 0.0);
4700         /* stderr could be line buffered */
4701         fflush(stderr);
4702     }
4703 }
4704
4705
4706 /****************************************************************************************************************/
4707 /* signal_pipe handling */
4708
4709
4710 #ifdef _WIN32
4711 static gboolean
4712 signal_pipe_check_running(void)
4713 {
4714     /* any news from our parent? -> just stop the capture */
4715     DWORD avail = 0;
4716     gboolean result;
4717
4718     /* if we are running standalone, no check required */
4719     if(!capture_child) {
4720         return TRUE;
4721     }
4722
4723     if(!sig_pipe_name || !sig_pipe_handle) {
4724         /* This shouldn't happen */
4725         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
4726             "Signal pipe: No name or handle");
4727         return FALSE;
4728     }
4729
4730     /*
4731      * XXX - We should have the process ID of the parent (from the "-Z" flag)
4732      * at this point.  Should we check to see if the parent is still alive,
4733      * e.g. by using OpenProcess?
4734      */
4735
4736     result = PeekNamedPipe(sig_pipe_handle, NULL, 0, NULL, &avail, NULL);
4737
4738     if(!result || avail > 0) {
4739         /* peek failed or some bytes really available */
4740         /* (if not piping from stdin this would fail) */
4741         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO,
4742             "Signal pipe: Stop capture: %s", sig_pipe_name);
4743         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG,
4744             "Signal pipe: %s (%p) result: %u avail: %u", sig_pipe_name,
4745             sig_pipe_handle, result, avail);
4746         return FALSE;
4747     } else {
4748         /* pipe ok and no bytes available */
4749         return TRUE;
4750     }
4751 }
4752 #endif
4753
4754 /*
4755  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
4756  *
4757  * Local variables:
4758  * c-basic-offset: 4
4759  * tab-width: 8
4760  * indent-tabs-mode: nil
4761  * End:
4762  *
4763  * vi: set shiftwidth=4 tabstop=8 expandtab:
4764  * :indentSize=4:tabSize=8:noTabs=true:
4765  */