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