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