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