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