add new function tvb_get_ephemeral_stringz()
[obnox/wireshark/wip.git] / capture_loop.c
1 /* capture_loop.c
2  * The actual capturing loop, getting packets and storing it
3  *
4  * $Id$
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@ethereal.com>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25
26 /** @file
27  *  
28  * Capture loop (internal interface).
29  *
30  * It will open the input and output files, capture the packets, 
31  * change ringbuffer output files while capturing and close all files again.
32  * 
33  * The input file can be a network interface or capture pipe (unix only).
34  * The output file can be a single or a ringbuffer file handled by wiretap.
35  *
36  */
37
38 #ifdef HAVE_CONFIG_H
39 # include "config.h"
40 #endif
41
42 #ifdef HAVE_LIBPCAP
43
44 #include <string.h>
45
46 #ifdef HAVE_FCNTL_H
47 #include <fcntl.h>
48 #endif
49
50 #ifdef HAVE_UNISTD_H
51 #include <unistd.h>
52 #endif
53
54 #ifdef HAVE_SYS_TYPES_H
55 # include <sys/types.h>
56 #endif
57
58 #ifdef HAVE_SYS_STAT_H
59 # include <sys/stat.h>
60 #endif
61
62 #include <signal.h>
63 #include <errno.h>
64
65 #include <pcap.h>
66
67 #include <glib.h>
68
69 #include <epan/packet.h>
70 #include "capture.h"
71 #include "capture_sync.h"
72 #include "pcap-util.h"
73
74 #include "simple_dialog.h"
75 #include "conditions.h"
76 #include "capture_stop_conditions.h"
77 #include "ringbuffer.h"
78
79 #include "wiretap/libpcap.h"
80 #include "wiretap/wtap.h"
81 #include "wiretap/wtap-capture.h"
82
83 #include <epan/prefs.h>
84 /* XXX - try to remove this later */
85 #include "ui_util.h"
86 /* XXX - try to remove this later */
87 #include "util.h"
88 #include "alert_box.h"
89 #include "log.h"
90
91
92 #include <epan/dissectors/packet-ap1394.h>
93 #include <epan/dissectors/packet-atalk.h>
94 #include <epan/dissectors/packet-atm.h>
95 #include <epan/dissectors/packet-clip.h>
96 #include <epan/dissectors/packet-eth.h>
97 #include <epan/dissectors/packet-fddi.h>
98 #include <epan/dissectors/packet-fr.h>
99 #include <epan/dissectors/packet-null.h>
100 #include <epan/dissectors/packet-ppp.h>
101 #include <epan/dissectors/packet-raw.h>
102 #include <epan/dissectors/packet-sll.h>
103 #include <epan/dissectors/packet-tr.h>
104 #include <epan/dissectors/packet-ieee80211.h>
105 #include <epan/dissectors/packet-chdlc.h>
106 #include <epan/dissectors/packet-prism.h>
107 #include <epan/dissectors/packet-ipfc.h>
108 #include <epan/dissectors/packet-arcnet.h>
109
110 /* Win32 needs the O_BINARY flag for open() */
111 #ifndef O_BINARY
112 #define O_BINARY        0
113 #endif
114
115
116
117 /*
118  * We don't want to do a "select()" on the pcap_t's file descriptor on
119  * BSD (because "select()" doesn't work correctly on BPF devices on at
120  * least some releases of some flavors of BSD), and we don't want to do
121  * it on Windows (because "select()" is something for sockets, not for
122  * arbitrary handles).  (Note that "Windows" here includes Cygwin;
123  * even in its pretend-it's-UNIX environment, we're using WinPcap, not
124  * a UNIX libpcap.)
125  *
126  * We *do* want to do it on other platforms, as, on other platforms (with
127  * the possible exception of Ultrix and Digital UNIX), the read timeout
128  * doesn't expire if no packets have arrived, so a "pcap_dispatch()" call
129  * will block until packets arrive, causing the UI to hang.
130  *
131  * XXX - the various BSDs appear to define BSD in <sys/param.h>; we don't
132  * want to include it if it's not present on this platform, however.
133  */
134 #if !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && \
135     !defined(__bsdi__) && !defined(__APPLE__) && !defined(_WIN32) && \
136     !defined(__CYGWIN__)
137 # define MUST_DO_SELECT
138 #endif
139
140
141 typedef struct _loop_data {
142   /* common */
143   gboolean       go;                    /* TRUE as long as we're supposed to keep capturing */
144   int            err;                   /* if non-zero, error seen while capturing */
145   gint           packets_max;           /* Number of packets we're supposed to capture - 0 means infinite */
146   gint           packets_sync_pipe;     /* packets not already send out to the sync_pipe */
147   packet_counts  counts;                /* several packet type counters */
148
149   /* pcap "input file" */
150   pcap_t        *pcap_h;                /* pcap handle */
151   gboolean       pcap_err;              /* TRUE if error from pcap */
152 #ifdef MUST_DO_SELECT
153   int            pcap_fd;               /* pcap file descriptor */
154 #endif
155
156   /* capture pipe (unix only "input file") */
157   gboolean       from_cap_pipe;         /* TRUE if we are capturing data from a capture pipe */
158 #ifndef _WIN32
159   struct pcap_hdr cap_pipe_hdr;
160   struct pcaprec_modified_hdr cap_pipe_rechdr;
161   int            cap_pipe_fd;           /* the file descriptor of the capture pipe */
162   gboolean       cap_pipe_modified;     /* TRUE if data in the pipe uses modified pcap headers */
163   gboolean       cap_pipe_byte_swapped; /* TRUE if data in the pipe is byte swapped */
164   unsigned int   cap_pipe_bytes_to_read;/* Used by cap_pipe_dispatch */
165   unsigned int   cap_pipe_bytes_read;   /* Used by cap_pipe_dispatch */
166   enum {
167          STATE_EXPECT_REC_HDR,
168          STATE_READ_REC_HDR,
169          STATE_EXPECT_DATA,
170          STATE_READ_DATA
171        } cap_pipe_state;
172
173   enum { PIPOK, PIPEOF, PIPERR, PIPNEXIST } cap_pipe_err;
174 #endif
175
176   /* wiretap (output file) */
177   wtap_dumper   *wtap_pdh;
178   gint           wtap_linktype;
179
180 } loop_data;
181
182
183 /*
184  * Timeout, in milliseconds, for reads from the stream of captured packets.
185  */
186 #define CAP_READ_TIMEOUT        250
187
188 static void capture_loop_packet_cb(guchar *user, const struct pcap_pkthdr *phdr,
189   const guchar *pd);
190 static void capture_loop_popup_errmsg(capture_options *capture_opts, const char *errmsg);
191 static void capture_loop_get_errmsg(char *errmsg, int errmsglen, const char *fname,
192                           int err, gboolean is_close);
193
194
195
196 #ifndef _WIN32
197 /* Take care of byte order in the libpcap headers read from pipes.
198  * (function taken from wiretap/libpcap.c) */
199 static void
200 cap_pipe_adjust_header(loop_data *ld, struct pcap_hdr *hdr, struct pcaprec_hdr *rechdr)
201 {
202   if (ld->cap_pipe_byte_swapped) {
203     /* Byte-swap the record header fields. */
204     rechdr->ts_sec = BSWAP32(rechdr->ts_sec);
205     rechdr->ts_usec = BSWAP32(rechdr->ts_usec);
206     rechdr->incl_len = BSWAP32(rechdr->incl_len);
207     rechdr->orig_len = BSWAP32(rechdr->orig_len);
208   }
209
210   /* In file format version 2.3, the "incl_len" and "orig_len" fields were
211      swapped, in order to match the BPF header layout.
212
213      Unfortunately, some files were, according to a comment in the "libpcap"
214      source, written with version 2.3 in their headers but without the
215      interchanged fields, so if "incl_len" is greater than "orig_len" - which
216      would make no sense - we assume that we need to swap them.  */
217   if (hdr->version_major == 2 &&
218       (hdr->version_minor < 3 ||
219        (hdr->version_minor == 3 && rechdr->incl_len > rechdr->orig_len))) {
220     guint32 temp;
221
222     temp = rechdr->orig_len;
223     rechdr->orig_len = rechdr->incl_len;
224     rechdr->incl_len = temp;
225   }
226 }
227
228 /* Mimic pcap_open_live() for pipe captures
229  * We check if "pipename" is "-" (stdin) or a FIFO, open it, and read the
230  * header.
231  * N.B. : we can't read the libpcap formats used in RedHat 6.1 or SuSE 6.3
232  * because we can't seek on pipes (see wiretap/libpcap.c for details) */
233 static int
234 cap_pipe_open_live(char *pipename, struct pcap_hdr *hdr, loop_data *ld,
235                  char *errmsg, int errmsgl)
236 {
237   struct stat pipe_stat;
238   int         fd;
239   guint32     magic;
240   int         b, sel_ret;
241   unsigned int bytes_read;
242   fd_set      rfds;
243   struct timeval timeout;
244
245
246   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_open_live: %s", pipename);
247
248   /*
249    * XXX Ethereal blocks until we return
250    */
251   if (strcmp(pipename, "-") == 0)
252     fd = 0; /* read from stdin */
253   else {
254     if (stat(pipename, &pipe_stat) < 0) {
255       if (errno == ENOENT || errno == ENOTDIR)
256         ld->cap_pipe_err = PIPNEXIST;
257       else {
258         g_snprintf(errmsg, errmsgl,
259           "The capture session could not be initiated "
260           "due to error on pipe: %s", strerror(errno));
261         ld->cap_pipe_err = PIPERR;
262       }
263       return -1;
264     }
265     if (! S_ISFIFO(pipe_stat.st_mode)) {
266       if (S_ISCHR(pipe_stat.st_mode)) {
267         /*
268          * Assume the user specified an interface on a system where
269          * interfaces are in /dev.  Pretend we haven't seen it.
270          */
271          ld->cap_pipe_err = PIPNEXIST;
272       } else {
273         g_snprintf(errmsg, errmsgl,
274             "The capture session could not be initiated because\n"
275             "\"%s\" is neither an interface nor a pipe", pipename);
276         ld->cap_pipe_err = PIPERR;
277       }
278       return -1;
279     }
280     fd = open(pipename, O_RDONLY | O_NONBLOCK);
281     if (fd == -1) {
282       g_snprintf(errmsg, errmsgl,
283           "The capture session could not be initiated "
284           "due to error on pipe open: %s", strerror(errno));
285       ld->cap_pipe_err = PIPERR;
286       return -1;
287     }
288   }
289
290   ld->from_cap_pipe = TRUE;
291
292   /* read the pcap header */
293   FD_ZERO(&rfds);
294   bytes_read = 0;
295   while (bytes_read < sizeof magic) {
296     FD_SET(fd, &rfds);
297     timeout.tv_sec = 0;
298     timeout.tv_usec = CAP_READ_TIMEOUT*1000;
299     sel_ret = select(fd+1, &rfds, NULL, NULL, &timeout);
300     if (sel_ret < 0) {
301       g_snprintf(errmsg, errmsgl,
302         "Unexpected error from select: %s", strerror(errno));
303       goto error;
304     } else if (sel_ret > 0) {
305       b = read(fd, ((char *)&magic)+bytes_read, sizeof magic-bytes_read);
306       if (b <= 0) {
307         if (b == 0)
308           g_snprintf(errmsg, errmsgl, "End of file on pipe during open");
309         else
310           g_snprintf(errmsg, errmsgl, "Error on pipe during open: %s",
311             strerror(errno));
312         goto error;
313       }
314       bytes_read += b;
315     }
316   }
317
318   switch (magic) {
319   case PCAP_MAGIC:
320     /* Host that wrote it has our byte order, and was running
321        a program using either standard or ss990417 libpcap. */
322     ld->cap_pipe_byte_swapped = FALSE;
323     ld->cap_pipe_modified = FALSE;
324     break;
325   case PCAP_MODIFIED_MAGIC:
326     /* Host that wrote it has our byte order, but was running
327        a program using either ss990915 or ss991029 libpcap. */
328     ld->cap_pipe_byte_swapped = FALSE;
329     ld->cap_pipe_modified = TRUE;
330     break;
331   case PCAP_SWAPPED_MAGIC:
332     /* Host that wrote it has a byte order opposite to ours,
333        and was running a program using either standard or
334        ss990417 libpcap. */
335     ld->cap_pipe_byte_swapped = TRUE;
336     ld->cap_pipe_modified = FALSE;
337     break;
338   case PCAP_SWAPPED_MODIFIED_MAGIC:
339     /* Host that wrote it out has a byte order opposite to
340        ours, and was running a program using either ss990915
341        or ss991029 libpcap. */
342     ld->cap_pipe_byte_swapped = TRUE;
343     ld->cap_pipe_modified = TRUE;
344     break;
345   default:
346     /* Not a "libpcap" type we know about. */
347     g_snprintf(errmsg, errmsgl, "Unrecognized libpcap format");
348     goto error;
349   }
350
351   /* Read the rest of the header */
352   bytes_read = 0;
353   while (bytes_read < sizeof(struct pcap_hdr)) {
354     FD_SET(fd, &rfds);
355     timeout.tv_sec = 0;
356     timeout.tv_usec = CAP_READ_TIMEOUT*1000;
357     sel_ret = select(fd+1, &rfds, NULL, NULL, &timeout);
358     if (sel_ret < 0) {
359       g_snprintf(errmsg, errmsgl,
360         "Unexpected error from select: %s", strerror(errno));
361       goto error;
362     } else if (sel_ret > 0) {
363       b = read(fd, ((char *)hdr)+bytes_read,
364             sizeof(struct pcap_hdr) - bytes_read);
365       if (b <= 0) {
366         if (b == 0)
367           g_snprintf(errmsg, errmsgl, "End of file on pipe during open");
368         else
369           g_snprintf(errmsg, errmsgl, "Error on pipe during open: %s",
370             strerror(errno));
371         goto error;
372       }
373       bytes_read += b;
374     }
375   }
376
377   if (ld->cap_pipe_byte_swapped) {
378     /* Byte-swap the header fields about which we care. */
379     hdr->version_major = BSWAP16(hdr->version_major);
380     hdr->version_minor = BSWAP16(hdr->version_minor);
381     hdr->snaplen = BSWAP32(hdr->snaplen);
382     hdr->network = BSWAP32(hdr->network);
383   }
384
385   if (hdr->version_major < 2) {
386     g_snprintf(errmsg, errmsgl, "Unable to read old libpcap format");
387     goto error;
388   }
389
390   ld->cap_pipe_state = STATE_EXPECT_REC_HDR;
391   ld->cap_pipe_err = PIPOK;
392   return fd;
393
394 error:
395   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_open_live: error %s", errmsg);
396   ld->cap_pipe_err = PIPERR;
397   close(fd);
398   return -1;
399
400 }
401
402
403 /* We read one record from the pipe, take care of byte order in the record
404  * header, write the record to the capture file, and update capture statistics. */
405 static int
406 cap_pipe_dispatch(int fd, loop_data *ld, struct pcap_hdr *hdr,
407                 struct pcaprec_modified_hdr *rechdr, guchar *data,
408                 char *errmsg, int errmsgl)
409 {
410   struct pcap_pkthdr phdr;
411   int b;
412   enum { PD_REC_HDR_READ, PD_DATA_READ, PD_PIPE_EOF, PD_PIPE_ERR,
413           PD_ERR } result;
414
415
416 #ifdef LOG_CAPTURE_VERBOSE
417   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "cap_pipe_dispatch");
418 #endif
419
420   switch (ld->cap_pipe_state) {
421
422   case STATE_EXPECT_REC_HDR:
423     ld->cap_pipe_bytes_to_read = ld->cap_pipe_modified ?
424       sizeof(struct pcaprec_modified_hdr) : sizeof(struct pcaprec_hdr);
425     ld->cap_pipe_bytes_read = 0;
426     ld->cap_pipe_state = STATE_READ_REC_HDR;
427     /* Fall through */
428
429   case STATE_READ_REC_HDR:
430     b = read(fd, ((char *)rechdr)+ld->cap_pipe_bytes_read,
431       ld->cap_pipe_bytes_to_read - ld->cap_pipe_bytes_read);
432     if (b <= 0) {
433       if (b == 0)
434         result = PD_PIPE_EOF;
435       else
436         result = PD_PIPE_ERR;
437       break;
438     }
439     if ((ld->cap_pipe_bytes_read += b) < ld->cap_pipe_bytes_to_read)
440         return 0;
441     result = PD_REC_HDR_READ;
442     break;
443
444   case STATE_EXPECT_DATA:
445     ld->cap_pipe_bytes_read = 0;
446     ld->cap_pipe_state = STATE_READ_DATA;
447     /* Fall through */
448
449   case STATE_READ_DATA:
450     b = read(fd, data+ld->cap_pipe_bytes_read, rechdr->hdr.incl_len - ld->cap_pipe_bytes_read);
451     if (b <= 0) {
452       if (b == 0)
453         result = PD_PIPE_EOF;
454       else
455         result = PD_PIPE_ERR;
456       break;
457     }
458     if ((ld->cap_pipe_bytes_read += b) < rechdr->hdr.incl_len)
459       return 0;
460     result = PD_DATA_READ;
461     break;
462
463   default:
464     g_snprintf(errmsg, errmsgl, "cap_pipe_dispatch: invalid state");
465     result = PD_ERR;
466
467   } /* switch (ld->cap_pipe_state) */
468
469   /*
470    * We've now read as much data as we were expecting, so process it.
471    */
472   switch (result) {
473
474   case PD_REC_HDR_READ:
475     /* We've read the header. Take care of byte order. */
476     cap_pipe_adjust_header(ld, hdr, &rechdr->hdr);
477     if (rechdr->hdr.incl_len > WTAP_MAX_PACKET_SIZE) {
478       g_snprintf(errmsg, errmsgl, "Frame %u too long (%d bytes)",
479         ld->counts.total+1, rechdr->hdr.incl_len);
480       break;
481     }
482     ld->cap_pipe_state = STATE_EXPECT_DATA;
483     return 0;
484
485   case PD_DATA_READ:
486     /* Fill in a "struct pcap_pkthdr", and process the packet. */
487     phdr.ts.tv_sec = rechdr->hdr.ts_sec;
488     phdr.ts.tv_usec = rechdr->hdr.ts_usec;
489     phdr.caplen = rechdr->hdr.incl_len;
490     phdr.len = rechdr->hdr.orig_len;
491
492     capture_loop_packet_cb((guchar *)ld, &phdr, data);
493
494     ld->cap_pipe_state = STATE_EXPECT_REC_HDR;
495     return 1;
496
497   case PD_PIPE_EOF:
498     ld->cap_pipe_err = PIPEOF;
499     return -1;
500
501   case PD_PIPE_ERR:
502     g_snprintf(errmsg, errmsgl, "Error reading from pipe: %s",
503       strerror(errno));
504     /* Fall through */
505   case PD_ERR:
506     break;
507   }
508
509   ld->cap_pipe_err = PIPERR;
510   /* Return here rather than inside the switch to prevent GCC warning */
511   return -1;
512 }
513 #endif /* not _WIN32 */
514
515
516 /* open the capture input file (pcap or capture pipe) */
517 static int capture_loop_open_input(capture_options *capture_opts, loop_data *ld, char *errmsg, int errmsg_len) {
518   gchar       open_err_str[PCAP_ERRBUF_SIZE];
519   const char *set_linktype_err_str;
520 #ifdef _WIN32
521   int         err;
522   WORD        wVersionRequested;
523   WSADATA     wsaData;
524 #else
525   static const char ppamsg[] = "can't find PPA for ";
526   const char  *libpcap_warn;
527 #endif
528
529
530   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_open_input : %s", capture_opts->iface);
531
532   /* Initialize Windows Socket if we are in a WIN32 OS
533      This needs to be done before querying the interface for network/netmask */
534 #ifdef _WIN32
535   /* XXX - do we really require 1.1 or earlier?
536      Are there any versions that support only 2.0 or higher? */
537   wVersionRequested = MAKEWORD(1, 1);
538   err = WSAStartup(wVersionRequested, &wsaData);
539   if (err != 0) {
540     switch (err) {
541
542     case WSASYSNOTREADY:
543       g_snprintf(errmsg, errmsg_len,
544         "Couldn't initialize Windows Sockets: Network system not ready for network communication");
545       break;
546
547     case WSAVERNOTSUPPORTED:
548       g_snprintf(errmsg, errmsg_len,
549         "Couldn't initialize Windows Sockets: Windows Sockets version %u.%u not supported",
550         LOBYTE(wVersionRequested), HIBYTE(wVersionRequested));
551       break;
552
553     case WSAEINPROGRESS:
554       g_snprintf(errmsg, errmsg_len,
555         "Couldn't initialize Windows Sockets: Blocking operation is in progress");
556       break;
557
558     case WSAEPROCLIM:
559       g_snprintf(errmsg, errmsg_len,
560         "Couldn't initialize Windows Sockets: Limit on the number of tasks supported by this WinSock implementation has been reached");
561       break;
562
563     case WSAEFAULT:
564       g_snprintf(errmsg, errmsg_len,
565         "Couldn't initialize Windows Sockets: Bad pointer passed to WSAStartup");
566       break;
567
568     default:
569       g_snprintf(errmsg, errmsg_len,
570         "Couldn't initialize Windows Sockets: error %d", err);
571       break;
572     }
573     return FALSE;
574   }
575 #endif
576
577   /* Open the network interface to capture from it.
578      Some versions of libpcap may put warnings into the error buffer
579      if they succeed; to tell if that's happened, we have to clear
580      the error buffer, and check if it's still a null string.  */
581   open_err_str[0] = '\0';
582   ld->pcap_h = pcap_open_live(capture_opts->iface,
583                        capture_opts->has_snaplen ? capture_opts->snaplen :
584                                                   WTAP_MAX_PACKET_SIZE,
585                        capture_opts->promisc_mode, CAP_READ_TIMEOUT,
586                        open_err_str);
587
588   if (ld->pcap_h != NULL) {
589     /* we've opened "iface" as a network device */
590 #ifdef _WIN32
591     /* try to set the capture buffer size */
592     if (pcap_setbuff(ld->pcap_h, capture_opts->buffer_size * 1024 * 1024) != 0) {
593         simple_dialog(ESD_TYPE_INFO, ESD_BTN_OK,
594           "%sCouldn't set the capture buffer size!%s\n"
595           "\n"
596           "The capture buffer size of %luMB seems to be too high for your machine,\n"
597           "the default of 1MB will be used.\n"
598           "\n"
599           "Nonetheless, the capture is started.\n",
600           simple_dialog_primary_start(), simple_dialog_primary_end(), capture_opts->buffer_size);
601     }
602 #endif
603
604     /* setting the data link type only works on real interfaces */
605     if (capture_opts->linktype != -1) {
606       set_linktype_err_str = set_pcap_linktype(ld->pcap_h, capture_opts->iface,
607         capture_opts->linktype);
608       if (set_linktype_err_str != NULL) {
609         g_snprintf(errmsg, errmsg_len, "Unable to set data link type (%s).",
610           set_linktype_err_str);
611         return FALSE;
612       }
613     }
614   } else {
615     /* We couldn't open "iface" as a network device. */
616 #ifdef _WIN32
617     /* On Windows, we don't support capturing on pipes, so we give up. */
618
619     /* On Win32 OSes, the capture devices are probably available to all
620        users; don't warn about permissions problems.
621
622        Do, however, warn that WAN devices aren't supported. */
623     g_snprintf(errmsg, errmsg_len,
624 "%sThe capture session could not be initiated!%s\n"
625 "\n"
626 "(%s)\n"
627 "\n"
628 "Please check that you have the proper interface specified.\n"
629 "\n"
630 "Note that version 3.0 of WinPcap, and earlier versions of WinPcap, don't\n"
631 "support capturing on PPP/WAN interfaces in Windows NT 4.0 / 2000 / XP / Server 2003.\n"
632 "\n"
633 "WinPcap 3.1 has experimental support for it on Windows 2000 / XP / Server 2003,\n"
634 "but has no support for it on Windows NT 4.0.  WinPcap 3.1 is currently in beta,\n"
635 "so using it might introduce bugs not present in WinPcap 3.0; you should report\n"
636 "all problems you see to the WinPcap developers, so they can try to fix\n"
637 "them before the final WinPcap 3.1 release.",
638         simple_dialog_primary_start(), simple_dialog_primary_end(),
639     open_err_str);
640     return FALSE;
641 #else
642     /* try to open iface as a pipe */
643     ld->cap_pipe_fd = cap_pipe_open_live(capture_opts->iface, &ld->cap_pipe_hdr, ld, errmsg, errmsg_len);
644
645     if (ld->cap_pipe_fd == -1) {
646
647       if (ld->cap_pipe_err == PIPNEXIST) {
648         /* Pipe doesn't exist, so output message for interface */
649
650         /* If we got a "can't find PPA for XXX" message, warn the user (who
651            is running Ethereal on HP-UX) that they don't have a version
652            of libpcap that properly handles HP-UX (libpcap 0.6.x and later
653            versions, which properly handle HP-UX, say "can't find /dev/dlpi
654            PPA for XXX" rather than "can't find PPA for XXX"). */
655         if (strncmp(open_err_str, ppamsg, sizeof ppamsg - 1) == 0)
656           libpcap_warn =
657             "\n\n"
658             "You are running Ethereal with a version of the libpcap library\n"
659             "that doesn't handle HP-UX network devices well; this means that\n"
660             "Ethereal may not be able to capture packets.\n"
661             "\n"
662             "To fix this, you should install libpcap 0.6.2, or a later version\n"
663             "of libpcap, rather than libpcap 0.4 or 0.5.x.  It is available in\n"
664             "packaged binary form from the Software Porting And Archive Centre\n"
665             "for HP-UX; the Centre is at http://hpux.connect.org.uk/ - the page\n"
666             "at the URL lists a number of mirror sites.";
667         else
668           libpcap_warn = "";
669         g_snprintf(errmsg, errmsg_len,
670           "The capture session could not be initiated (%s).\n"
671           "Please check to make sure you have sufficient permissions, and that\n"
672           "you have the proper interface or pipe specified.%s", open_err_str,
673           libpcap_warn);
674       }
675       /*
676        * Else pipe (or file) does exist and cap_pipe_open_live() has
677        * filled in errmsg
678        */
679       return FALSE;
680     } else
681       /* cap_pipe_open_live() succeeded; don't want
682          error message from pcap_open_live() */
683       open_err_str[0] = '\0';
684 #endif
685   }
686
687 #ifdef MUST_DO_SELECT
688   if (!ld->from_cap_pipe) {
689 #ifdef HAVE_PCAP_GET_SELECTABLE_FD
690     ld->pcap_fd = pcap_get_selectable_fd(ld->pcap_h);
691 #else
692     ld->pcap_fd = pcap_fileno(ld->pcap_h);
693 #endif
694   }
695 #endif
696
697   /* Does "open_err_str" contain a non-empty string?  If so, "pcap_open_live()"
698      returned a warning; print it, but keep capturing. */
699   if (open_err_str[0] != '\0')
700     g_warning("%s.", open_err_str);
701
702   return TRUE;
703 }
704
705
706 /* open the capture input file (pcap or capture pipe) */
707 static void capture_loop_close_input(loop_data *ld) {
708
709   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_close_input");
710
711 #ifndef _WIN32
712   /* if open, close the capture pipe "input file" */
713   if (ld->cap_pipe_fd >= 0) {
714     g_assert(ld->from_cap_pipe);
715     close(ld->cap_pipe_fd);
716   }
717 #endif
718
719   /* if open, close the pcap "input file" */
720   if(ld->pcap_h != NULL) {
721     g_assert(!ld->from_cap_pipe);
722     pcap_close(ld->pcap_h);
723   }
724
725 #ifdef _WIN32
726   /* Shut down windows sockets */
727   WSACleanup();
728 #endif
729 }
730
731
732 /* init the capture filter */
733 static int capture_loop_init_filter(loop_data *ld, const gchar * iface, gchar * cfilter, char *errmsg, int errmsg_len) {
734   bpf_u_int32 netnum, netmask;
735   gchar       lookup_net_err_str[PCAP_ERRBUF_SIZE];
736   struct bpf_program fcode;
737
738
739   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_init_filter: %s", cfilter);
740
741   /* capture filters only work on real interfaces */
742   if (cfilter && !ld->from_cap_pipe) {
743     /* A capture filter was specified; set it up. */
744     if (pcap_lookupnet(iface, &netnum, &netmask, lookup_net_err_str) < 0) {
745       /*
746        * Well, we can't get the netmask for this interface; it's used
747        * only for filters that check for broadcast IP addresses, so
748        * we just punt and use 0.  It might be nice to warn the user,
749        * but that's a pain in a GUI application, as it'd involve popping
750        * up a message box, and it's not clear how often this would make
751        * a difference (only filters that check for IP broadcast addresses
752        * use the netmask).
753        */
754       netmask = 0;
755     }
756     if (pcap_compile(ld->pcap_h, &fcode, cfilter, 1, netmask) < 0) {
757       dfilter_t   *rfcode = NULL;
758       /* filter string invalid, did the user tried a display filter? */
759       if (dfilter_compile(cfilter, &rfcode) && rfcode != NULL) {
760         g_snprintf(errmsg, errmsg_len,
761           "%sInvalid capture filter: \"%s\"!%s\n"
762           "\n"
763           "That string looks like a valid display filter; however, it isn't a valid\n"
764           "capture filter (%s).\n"
765           "\n"
766           "Note that display filters and capture filters don't have the same syntax,\n"
767           "so you can't use most display filter expressions as capture filters.\n"
768           "\n"
769           "See the help for a description of the capture filter syntax.",
770           simple_dialog_primary_start(), cfilter, simple_dialog_primary_end(),
771           pcap_geterr(ld->pcap_h));
772         dfilter_free(rfcode);
773       } else {
774         g_snprintf(errmsg, errmsg_len,
775           "%sInvalid capture filter: \"%s\"!%s\n"
776           "\n"
777           "That string isn't a valid capture filter (%s).\n"
778           "See the help for a description of the capture filter syntax.",
779           simple_dialog_primary_start(), cfilter, simple_dialog_primary_end(),
780           pcap_geterr(ld->pcap_h));
781       }
782       return FALSE;
783     }
784     if (pcap_setfilter(ld->pcap_h, &fcode) < 0) {
785       g_snprintf(errmsg, errmsg_len, "Can't install filter (%s).",
786         pcap_geterr(ld->pcap_h));
787 #ifdef HAVE_PCAP_FREECODE
788       pcap_freecode(&fcode);
789 #endif
790       return FALSE;
791     }
792 #ifdef HAVE_PCAP_FREECODE
793     pcap_freecode(&fcode);
794 #endif
795   }
796
797   return TRUE;
798 }
799
800
801 /* open the wiretap part of the capture output file */
802 static int capture_loop_init_wiretap_output(capture_options *capture_opts, int save_file_fd, loop_data *ld, char *errmsg, int errmsg_len) {
803   int         pcap_encap;
804   int         file_snaplen;
805   int         err;
806
807
808   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_init_wiretap_output");
809
810   /* get packet encapsulation type and snaplen */
811 #ifndef _WIN32
812   if (ld->from_cap_pipe) {
813     pcap_encap = ld->cap_pipe_hdr.network;
814     file_snaplen = ld->cap_pipe_hdr.snaplen;
815   } else
816 #endif
817   {
818     pcap_encap = get_pcap_linktype(ld->pcap_h, capture_opts->iface);
819     file_snaplen = pcap_snapshot(ld->pcap_h);
820   }
821
822   /* Set up to write to the capture file. */
823   ld->wtap_linktype = wtap_pcap_encap_to_wtap_encap(pcap_encap);
824   if (ld->wtap_linktype == WTAP_ENCAP_UNKNOWN) {
825     g_snprintf(errmsg, errmsg_len,
826         "The network you're capturing from is of a type"
827         " that Ethereal doesn't support (data link type %d).", pcap_encap);
828     return FALSE;
829   }
830   if (capture_opts->multi_files_on) {
831     ld->wtap_pdh = ringbuf_init_wtap_dump_fdopen(WTAP_FILE_PCAP, ld->wtap_linktype,
832       file_snaplen, &err);
833   } else {
834     ld->wtap_pdh = wtap_dump_fdopen(save_file_fd, WTAP_FILE_PCAP,
835       ld->wtap_linktype, file_snaplen, &err);
836   }
837
838   if (ld->wtap_pdh == NULL) {
839     /* We couldn't set up to write to the capture file. */
840     switch (err) {
841
842     case WTAP_ERR_CANT_OPEN:
843       strcpy(errmsg, "The file to which the capture would be saved"
844                " couldn't be created for some unknown reason.");
845       break;
846
847     case WTAP_ERR_SHORT_WRITE:
848       strcpy(errmsg, "A full header couldn't be written to the file"
849                " to which the capture would be saved.");
850       break;
851
852     default:
853       if (err < 0) {
854         g_snprintf(errmsg, errmsg_len,
855                      "The file to which the capture would be"
856                      " saved (\"%s\") could not be opened: Error %d.",
857                         capture_opts->save_file, err);
858       } else {
859         g_snprintf(errmsg, errmsg_len,
860                      "The file to which the capture would be"
861                      " saved (\"%s\") could not be opened: %s.",
862                         capture_opts->save_file, strerror(err));
863       }
864       break;
865     }
866
867     return FALSE;
868   }
869
870   return TRUE;
871 }
872
873 static gboolean capture_loop_close_output(capture_options *capture_opts, loop_data *ld, int *err_close) {
874
875   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_close_output");
876
877   if (capture_opts->multi_files_on) {
878     return ringbuf_wtap_dump_close(&capture_opts->save_file, err_close);
879   } else {
880     return wtap_dump_close(ld->wtap_pdh, err_close);
881   }
882 }
883
884 /* dispatch incoming packets (pcap or capture pipe) */
885 static int
886 capture_loop_dispatch(capture_options *capture_opts, loop_data *ld,
887                       char *errmsg, int errmsg_len) {
888   int       inpkts;
889 #ifndef _WIN32
890   fd_set    set1;
891   struct timeval timeout;
892   int         sel_ret;
893   guchar pcap_data[WTAP_MAX_PACKET_SIZE];
894 #endif
895
896 #ifndef _WIN32
897     if (ld->from_cap_pipe) {
898       /* dispatch from capture pipe */
899 #ifdef LOG_CAPTURE_VERBOSE
900       g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from capture pipe");
901 #endif
902       FD_ZERO(&set1);
903       FD_SET(ld->cap_pipe_fd, &set1);
904       timeout.tv_sec = 0;
905       timeout.tv_usec = CAP_READ_TIMEOUT*1000;
906       sel_ret = select(ld->cap_pipe_fd+1, &set1, NULL, NULL, &timeout);
907       if (sel_ret <= 0) {
908         inpkts = 0;
909         if (sel_ret < 0 && errno != EINTR) {
910           g_snprintf(errmsg, errmsg_len,
911             "Unexpected error from select: %s", strerror(errno));
912           capture_loop_popup_errmsg(capture_opts, errmsg);
913           ld->go = FALSE;
914         }
915       } else {
916         /*
917          * "select()" says we can read from the pipe without blocking
918          */
919         inpkts = cap_pipe_dispatch(ld->cap_pipe_fd, ld, &ld->cap_pipe_hdr, &ld->cap_pipe_rechdr, pcap_data,
920           errmsg, errmsg_len);
921         if (inpkts < 0) {
922           ld->go = FALSE;
923         }
924       }
925     }
926     else
927 #endif /* _WIN32 */
928     {
929       /* dispatch from pcap */
930 #ifdef MUST_DO_SELECT
931       /*
932        * Sigh.  The semantics of the read timeout argument to
933        * "pcap_open_live()" aren't particularly well specified by
934        * the "pcap" man page - at least with the BSD BPF code, the
935        * intent appears to be, at least in part, a way of cutting
936        * down the number of reads done on a capture, by blocking
937        * until the buffer fills or a timer expires - and the Linux
938        * libpcap doesn't actually support it, so we can't use it
939        * to break out of the "pcap_dispatch()" every 1/4 of a second
940        * or so.  Linux's libpcap is not the only libpcap that doesn't
941        * support the read timeout.
942        *
943        * Furthermore, at least on Solaris, the bufmod STREAMS module's
944        * read timeout won't go off if no data has arrived, i.e. it cannot
945        * be used to guarantee that a read from a DLPI stream will return
946        * within a specified amount of time regardless of whether any
947        * data arrives or not.
948        *
949        * Thus, on all platforms other than BSD, we do a "select()" on the
950        * file descriptor for the capture, with a timeout of CAP_READ_TIMEOUT
951        * milliseconds, or CAP_READ_TIMEOUT*1000 microseconds.
952        *
953        * "select()", on BPF devices, doesn't work as you might expect;
954        * at least on some versions of some flavors of BSD, the timer
955        * doesn't start until a read is done, so it won't expire if
956        * only a "select()" or "poll()" is posted.
957        *
958        * If we have "pcap_get_selectable_fd()", we use it to get the
959        * descriptor on which to select; if that's -1, it means there
960        * is no descriptor on which you can do a "select()" (perhaps
961        * because you're capturing on a special device, and that device's
962        * driver unfortunately doesn't support "select()", in which case
963        * we don't do the select - which means Ethereal might block,
964        * unable to accept user input, until a packet arrives.  If
965        * that's unacceptable, plead with whoever supplies the software
966        * for that device to add "select()" support.
967        */
968 #ifdef LOG_CAPTURE_VERBOSE
969       g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_dispatch with select");
970 #endif
971       if (ld->pcap_fd != -1) {
972         FD_ZERO(&set1);
973         FD_SET(ld->pcap_fd, &set1);
974         timeout.tv_sec = 0;
975         timeout.tv_usec = CAP_READ_TIMEOUT*1000;
976         sel_ret = select(ld->pcap_fd+1, &set1, NULL, NULL, &timeout);
977         if (sel_ret > 0) {
978           /*
979            * "select()" says we can read from it without blocking; go for
980            * it.
981            */
982           inpkts = pcap_dispatch(ld->pcap_h, 1, capture_loop_packet_cb, (gchar *)ld);
983           if (inpkts < 0) {
984             ld->pcap_err = TRUE;
985             ld->go = FALSE;
986           }
987         } else {
988           inpkts = 0;
989           if (sel_ret < 0 && errno != EINTR) {
990             g_snprintf(errmsg, errmsg_len,
991               "Unexpected error from select: %s", strerror(errno));
992             capture_loop_popup_errmsg(capture_opts, errmsg);
993             ld->go = FALSE;
994           }
995         }
996       }
997       else
998 #endif /* MUST_DO_SELECT */
999       {
1000         /* dispatch from pcap without select */
1001 #if 1
1002 #ifdef LOG_CAPTURE_VERBOSE
1003         g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_dispatch");
1004 #endif
1005         inpkts = pcap_dispatch(ld->pcap_h, 1, capture_loop_packet_cb, (gchar *) ld);
1006         if (inpkts < 0) {
1007           ld->pcap_err = TRUE;
1008           ld->go = FALSE;
1009         }
1010 #else
1011         {
1012 #ifdef LOG_CAPTURE_VERBOSE
1013             g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: from pcap_next_ex");
1014 #endif
1015             /* XXX - this is currently unused, as there is some confusion with pcap_next_ex() vs. pcap_dispatch() */
1016
1017             /* WinPcap's remote capturing feature doesn't work, see http://wiki.ethereal.com/CaptureSetup_2fWinPcapRemote */
1018             /* for reference, an example remote interface: rpcap://[1.2.3.4]/\Device\NPF_{39993D68-7C9B-4439-A329-F2D888DA7C5C} */
1019
1020             /* emulate dispatch from pcap */
1021             int in;
1022             struct pcap_pkthdr *pkt_header;
1023                     u_char *pkt_data;
1024
1025             inpkts = 0;
1026             while( (in = pcap_next_ex(ld->pcap_h, &pkt_header, &pkt_data)) == 1) {
1027                 capture_loop_packet_cb( (gchar *) ld, pkt_header, pkt_data);
1028                 inpkts++;
1029             }
1030
1031             if(in < 0) {
1032               ld->pcap_err = TRUE;
1033               ld->go = FALSE;
1034               inpkts = in;
1035             }
1036         }
1037 #endif
1038       }
1039     }
1040
1041 #ifdef LOG_CAPTURE_VERBOSE
1042     g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_dispatch: %d new packet%s", inpkts, plurality(inpkts, "", "s"));
1043 #endif
1044
1045     return inpkts;
1046 }
1047
1048
1049 /* open the output file (temporary/specified name/ringbuffer) */
1050 /* Returns TRUE if the file opened successfully, FALSE otherwise. */
1051 static gboolean
1052 capture_loop_open_output(capture_options *capture_opts, int *save_file_fd,
1053                       char *errmsg, int errmsg_len) {
1054
1055   char tmpname[128+1];
1056   gchar *capfile_name;
1057   gboolean is_tempfile;
1058
1059
1060   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, "capture_loop_open_output: %s", 
1061       (capture_opts->save_file) ? capture_opts->save_file : "");
1062
1063   if (capture_opts->save_file != NULL) {
1064     /* We return to the caller while the capture is in progress.  
1065      * Therefore we need to take a copy of save_file in
1066      * case the caller destroys it after we return.
1067      */
1068     capfile_name = g_strdup(capture_opts->save_file);
1069     if (capture_opts->multi_files_on) {
1070       /* ringbuffer is enabled */
1071       *save_file_fd = ringbuf_init(capfile_name,
1072           (capture_opts->has_ring_num_files) ? capture_opts->ring_num_files : 0);
1073
1074       /* we need the ringbuf name */
1075       if(*save_file_fd != -1) {
1076           g_free(capfile_name);
1077           capfile_name = g_strdup(ringbuf_current_filename());
1078       }
1079     } else {
1080       /* Try to open/create the specified file for use as a capture buffer. */
1081       *save_file_fd = open(capfile_name, O_RDWR|O_BINARY|O_TRUNC|O_CREAT,
1082                                 0600);
1083     }
1084     is_tempfile = FALSE;
1085   } else {
1086     /* Choose a random name for the temporary capture buffer */
1087     *save_file_fd = create_tempfile(tmpname, sizeof tmpname, "ether");
1088     capfile_name = g_strdup(tmpname);
1089     is_tempfile = TRUE;
1090   }
1091
1092   /* did we fail to open the output file? */
1093   if (*save_file_fd == -1) {
1094     if (is_tempfile) {
1095       g_snprintf(errmsg, errmsg_len,
1096         "The temporary file to which the capture would be saved (\"%s\") "
1097         "could not be opened: %s.", capfile_name, strerror(errno));
1098     } else {
1099       if (capture_opts->multi_files_on) {
1100         ringbuf_error_cleanup();
1101       }
1102
1103       g_snprintf(errmsg, errmsg_len,
1104             "The file to which the capture would be saved (\"%s\") "
1105         "could not be opened: %s.", capfile_name, 
1106         strerror(errno));
1107
1108       /*open_failure_alert_box(capfile_name, errno, TRUE);*/
1109     }
1110     g_free(capfile_name);
1111     return FALSE;
1112   }
1113
1114   if(capture_opts->save_file != NULL) {
1115     g_free(capture_opts->save_file);
1116   }
1117   capture_opts->save_file = capfile_name;
1118   /* capture_opts.save_file is "g_free"ed later, which is equivalent to
1119      "g_free(capfile_name)". */
1120
1121   return TRUE;
1122 }
1123
1124
1125 #ifndef _WIN32
1126 static void
1127 capture_loop_stop_signal_handler(int signo _U_)
1128 {
1129   capture_loop_stop();
1130 }
1131 #endif
1132
1133 #ifdef _WIN32
1134 #define TIME_GET() GetTickCount()
1135 #else
1136 #define TIME_GET() time(NULL)
1137 #endif
1138
1139 /*
1140  * This needs to be static, so that the SIGUSR1 handler can clear the "go"
1141  * flag.
1142  */
1143 static loop_data   ld;
1144
1145 /* Do the low-level work of a capture.
1146    Returns TRUE if it succeeds, FALSE otherwise. */
1147 int
1148 capture_loop_start(capture_options *capture_opts, gboolean *stats_known, struct pcap_stat *stats)
1149 {
1150   time_t      upd_time, cur_time;
1151   time_t      start_time;
1152   int         err_close, inpkts;
1153   condition  *cnd_file_duration = NULL;
1154   condition  *cnd_autostop_files = NULL;
1155   condition  *cnd_autostop_size = NULL;
1156   condition  *cnd_autostop_duration = NULL;
1157   guint32     autostop_files = 0;
1158   gboolean    write_ok;
1159   gboolean    close_ok;
1160   capture_info   capture_ui;
1161   char        errmsg[4096+1];
1162   int         save_file_fd;
1163
1164
1165   /* init the loop data */
1166   ld.go                 = TRUE;
1167   if (capture_opts->has_autostop_packets)
1168     ld.packets_max      = capture_opts->autostop_packets;
1169   else
1170     ld.packets_max      = 0;    /* no limit */
1171   ld.err                = 0;    /* no error seen yet */
1172   ld.wtap_linktype      = WTAP_ENCAP_UNKNOWN;
1173   ld.pcap_err           = FALSE;
1174   ld.from_cap_pipe      = FALSE;
1175   ld.packets_sync_pipe  = 0;
1176   ld.counts.total       = 0;
1177   ld.counts.sctp        = 0;
1178   ld.counts.tcp         = 0;
1179   ld.counts.udp         = 0;
1180   ld.counts.icmp        = 0;
1181   ld.counts.ospf        = 0;
1182   ld.counts.gre         = 0;
1183   ld.counts.ipx         = 0;
1184   ld.counts.netbios     = 0;
1185   ld.counts.vines       = 0;
1186   ld.counts.other       = 0;
1187   ld.counts.arp         = 0;
1188   ld.wtap_pdh           = NULL;
1189 #ifndef _WIN32
1190   ld.cap_pipe_fd        = -1;
1191 #endif
1192 #ifdef MUST_DO_SELECT
1193   ld.pcap_fd            = 0;
1194 #endif
1195
1196 #ifndef _WIN32
1197   /*
1198    * Catch SIGUSR1, so that we exit cleanly if the parent process
1199    * kills us with it due to the user selecting "Capture->Stop".
1200    */
1201     signal(SIGUSR1, capture_loop_stop_signal_handler);
1202 #endif
1203
1204   /* We haven't yet gotten the capture statistics. */
1205   *stats_known      = FALSE;
1206
1207   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture child starting ...");
1208 #ifdef LOG_CAPTURE_VERBOSE
1209   capture_opts_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_DEBUG, capture_opts);
1210 #endif
1211
1212   /* open the output file (temporary/specified name/ringbuffer) */
1213   if (!capture_loop_open_output(capture_opts, &save_file_fd, errmsg, sizeof(errmsg))) {
1214     goto error;    
1215   }
1216
1217   /* open the "input file" from network interface or capture pipe */
1218   if (!capture_loop_open_input(capture_opts, &ld, errmsg, sizeof(errmsg))) {
1219     goto error;
1220   }
1221
1222   /* init the input filter from the network interface (capture pipe will do nothing) */
1223   if (!capture_loop_init_filter(&ld, capture_opts->iface, capture_opts->cfilter, errmsg, sizeof(errmsg))) {
1224     goto error;
1225   }
1226
1227   /* open the wiretap part of the output file (the output file is already open) */
1228   if (!capture_loop_init_wiretap_output(capture_opts, save_file_fd, &ld, errmsg, sizeof(errmsg))) {
1229     goto error;
1230   }
1231
1232   /* XXX - capture SIGTERM and close the capture, in case we're on a
1233      Linux 2.0[.x] system and you have to explicitly close the capture
1234      stream in order to turn promiscuous mode off?  We need to do that
1235      in other places as well - and I don't think that works all the
1236      time in any case, due to libpcap bugs. */
1237
1238   /* Well, we should be able to start capturing.
1239
1240      Sync out the capture file, so the header makes it to the file system,
1241      and send a "capture started successfully and capture file created"
1242      message to our parent so that they'll open the capture file and
1243      update its windows to indicate that we have a live capture in
1244      progress. */
1245   fflush(wtap_dump_file(ld.wtap_pdh));
1246   sync_pipe_filename_to_parent(capture_opts->save_file);
1247
1248   /* initialize capture stop (and alike) conditions */
1249   init_capture_stop_conditions();
1250   /* create stop conditions */
1251   if (capture_opts->has_autostop_filesize)
1252     cnd_autostop_size =
1253         cnd_new(CND_CLASS_CAPTURESIZE,(long)capture_opts->autostop_filesize);
1254   if (capture_opts->has_autostop_duration)
1255     cnd_autostop_duration =
1256         cnd_new(CND_CLASS_TIMEOUT,(gint32)capture_opts->autostop_duration);
1257
1258   if (capture_opts->multi_files_on) {
1259       if (capture_opts->has_file_duration)
1260         cnd_file_duration =
1261             cnd_new(CND_CLASS_TIMEOUT, capture_opts->file_duration);
1262
1263       if (capture_opts->has_autostop_files)
1264         cnd_autostop_files =
1265             cnd_new(CND_CLASS_CAPTURESIZE, capture_opts->autostop_files);
1266   }
1267
1268   /* start capture info dialog */
1269   if(capture_opts->show_info) {
1270       capture_ui.callback_data  = &ld;
1271       capture_ui.counts         = &ld.counts;
1272       capture_info_create(&capture_ui, capture_opts->iface);
1273   }
1274
1275   /* init the time values */
1276   start_time = TIME_GET();
1277   upd_time = TIME_GET();
1278
1279
1280   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture child running!");
1281
1282   /* WOW, everything is prepared! */
1283   /* please fasten your seat belts, we will enter now the actual capture loop */
1284   while (ld.go) {
1285     main_window_update();
1286
1287     /* dispatch incoming packets */
1288     inpkts = capture_loop_dispatch(capture_opts, &ld, errmsg, sizeof(errmsg));
1289
1290     main_window_update();
1291
1292 #ifdef _WIN32
1293       /* some news from our parent (signal pipe)? -> just stop the capture */
1294       {
1295           HANDLE handle;
1296           DWORD avail = 0;
1297           gboolean result;
1298
1299
1300           handle = (HANDLE) _get_osfhandle (0);
1301           result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
1302
1303           if(!result || avail > 0) {
1304             ld.go = FALSE;
1305             /*g_warning("loop closing");*/
1306           }
1307       }
1308 #endif
1309
1310     if (inpkts > 0) {
1311       ld.packets_sync_pipe += inpkts;
1312
1313       /* check capture size condition */
1314       if (cnd_autostop_size != NULL && cnd_eval(cnd_autostop_size,
1315                     (guint32)wtap_get_bytes_dumped(ld.wtap_pdh))){
1316         /* Capture size limit reached, do we have another file? */
1317         if (capture_opts->multi_files_on) {
1318           if (cnd_autostop_files != NULL && cnd_eval(cnd_autostop_files, ++autostop_files)) {
1319             /* no files left: stop here */
1320             ld.go = FALSE;
1321             continue;
1322           }
1323
1324           /* Switch to the next ringbuffer file */
1325           if (ringbuf_switch_file(&ld.wtap_pdh, &capture_opts->save_file, &save_file_fd, &ld.err)) {
1326             /* File switch succeeded: reset the conditions */
1327             cnd_reset(cnd_autostop_size);
1328             if (cnd_file_duration) {
1329               cnd_reset(cnd_file_duration);
1330             }
1331             fflush(wtap_dump_file(ld.wtap_pdh));
1332             sync_pipe_filename_to_parent(capture_opts->save_file);
1333           } else {
1334             /* File switch failed: stop here */
1335             ld.go = FALSE;
1336             continue;
1337           }
1338         } else {
1339           /* single file, stop now */
1340           ld.go = FALSE;
1341           continue;
1342         }
1343       } /* cnd_autostop_size */
1344     } /* inpkts */
1345
1346     /* Only update once a second so as not to overload slow displays */
1347     cur_time = TIME_GET();
1348 #ifdef _WIN32
1349     if ( (cur_time - upd_time) > 500) {
1350 #else
1351     if (cur_time - upd_time > 0) {
1352 #endif
1353         upd_time = cur_time;
1354
1355       /*if (pcap_stats(pch, stats) >= 0) {
1356         *stats_known = TRUE;
1357       }*/
1358
1359       /* calculate and display running time */
1360       if(capture_opts->show_info) {
1361           cur_time -= start_time;
1362 #ifdef _WIN32
1363           capture_ui.running_time   = cur_time / 1000;
1364 #else
1365           capture_ui.running_time   = cur_time;
1366 #endif
1367           capture_ui.new_packets    = ld.packets_sync_pipe;
1368           capture_info_update(&capture_ui);
1369       }
1370
1371       /* Let the parent process know. */
1372       if (ld.packets_sync_pipe) {
1373         /* do sync here */
1374         fflush(wtap_dump_file(ld.wtap_pdh));
1375
1376           /* Send our parent a message saying we've written out "ld.sync_packets"
1377              packets to the capture file. */
1378         sync_pipe_packet_count_to_parent(ld.packets_sync_pipe);
1379
1380         ld.packets_sync_pipe = 0;
1381       }
1382
1383       /* check capture duration condition */
1384       if (cnd_autostop_duration != NULL && cnd_eval(cnd_autostop_duration)) {
1385         /* The maximum capture time has elapsed; stop the capture. */
1386         ld.go = FALSE;
1387         continue;
1388       }
1389       
1390       /* check capture file duration condition */
1391       if (cnd_file_duration != NULL && cnd_eval(cnd_file_duration)) {
1392         /* duration limit reached, do we have another file? */
1393         if (capture_opts->multi_files_on) {
1394           if (cnd_autostop_files != NULL && cnd_eval(cnd_autostop_files, ++autostop_files)) {
1395             /* no files left: stop here */
1396             ld.go = FALSE;
1397             continue;
1398           }
1399
1400           /* Switch to the next ringbuffer file */
1401           if (ringbuf_switch_file(&ld.wtap_pdh, &capture_opts->save_file, &save_file_fd, &ld.err)) {
1402             /* file switch succeeded: reset the conditions */
1403             cnd_reset(cnd_file_duration);
1404             if(cnd_autostop_size)
1405               cnd_reset(cnd_autostop_size);
1406             fflush(wtap_dump_file(ld.wtap_pdh));
1407             sync_pipe_filename_to_parent(capture_opts->save_file);
1408           } else {
1409             /* File switch failed: stop here */
1410                 ld.go = FALSE;
1411             continue;
1412           }
1413         } else {
1414           /* single file, stop now */
1415           ld.go = FALSE;
1416           continue;
1417         }
1418       } /* cnd_file_duration */
1419     }
1420
1421   } /* while (ld.go) */
1422
1423   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture child stopping ...");
1424
1425   /* close capture info dialog */
1426   if(capture_opts->show_info) {
1427     capture_info_destroy(&capture_ui);
1428   }
1429
1430   /* delete stop conditions */
1431   if (cnd_file_duration != NULL)
1432     cnd_delete(cnd_file_duration);
1433   if (cnd_autostop_files != NULL)
1434     cnd_delete(cnd_autostop_files);
1435   if (cnd_autostop_size != NULL)
1436     cnd_delete(cnd_autostop_size);
1437   if (cnd_autostop_duration != NULL)
1438     cnd_delete(cnd_autostop_duration);
1439
1440   /* did we had a pcap (input) error? */
1441   if (ld.pcap_err) {
1442     g_snprintf(errmsg, sizeof(errmsg), "Error while capturing packets: %s",
1443       pcap_geterr(ld.pcap_h));
1444     capture_loop_popup_errmsg(capture_opts, errmsg);
1445   }
1446 #ifndef _WIN32
1447     else if (ld.from_cap_pipe && ld.cap_pipe_err == PIPERR)
1448       capture_loop_popup_errmsg(capture_opts, errmsg);
1449 #endif
1450
1451   /* did we had an error while capturing? */
1452   if (ld.err == 0) {
1453     write_ok = TRUE;
1454   } else {
1455     capture_loop_get_errmsg(errmsg, sizeof(errmsg), capture_opts->save_file, ld.err,
1456                               FALSE);
1457     capture_loop_popup_errmsg(capture_opts, errmsg);
1458     write_ok = FALSE;
1459   }
1460
1461   /* close the wiretap (output) file */
1462   close_ok = capture_loop_close_output(capture_opts, &ld, &err_close);
1463
1464   /* If we've displayed a message about a write error, there's no point
1465      in displaying another message about an error on close. */
1466   if (!close_ok && write_ok) {
1467     capture_loop_get_errmsg(errmsg, sizeof(errmsg), capture_opts->save_file, err_close,
1468                 TRUE);
1469     capture_loop_popup_errmsg(capture_opts, errmsg);
1470   }
1471
1472   /*
1473    * XXX We exhibit different behaviour between normal mode and sync mode
1474    * when the pipe is stdin and not already at EOF.  If we're a child, the
1475    * parent's stdin isn't closed, so if the user starts another capture,
1476    * cap_pipe_open_live() will very likely not see the expected magic bytes and
1477    * will say "Unrecognized libpcap format".  On the other hand, in normal
1478    * mode, cap_pipe_open_live() will say "End of file on pipe during open".
1479    */
1480
1481   /* get packet drop statistics from pcap */
1482   if(ld.pcap_h != NULL) {
1483     g_assert(!ld.from_cap_pipe);
1484     /* Get the capture statistics, so we know how many packets were
1485        dropped. */
1486     if (pcap_stats(ld.pcap_h, stats) >= 0) {
1487       *stats_known = TRUE;
1488       /* Let the parent process know. */
1489       sync_pipe_drops_to_parent(stats->ps_drop);
1490     } else {
1491       g_snprintf(errmsg, sizeof(errmsg),
1492                 "Can't get packet-drop statistics: %s",
1493                 pcap_geterr(ld.pcap_h));
1494       capture_loop_popup_errmsg(capture_opts, errmsg);
1495     }
1496   }
1497
1498   /* close the input file (pcap or capture pipe) */
1499   capture_loop_close_input(&ld);
1500
1501   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture child stopped!");
1502
1503   /* ok, if the write and the close were successful. */
1504   return write_ok && close_ok;
1505
1506 error:
1507   if (capture_opts->multi_files_on) {
1508     /* cleanup ringbuffer */
1509     ringbuf_error_cleanup();
1510   } else {
1511     /* We can't use the save file, and we have no wtap_dump stream
1512        to close in order to close it, so close the FD directly. */
1513     close(save_file_fd);
1514
1515     /* We couldn't even start the capture, so get rid of the capture
1516        file. */
1517     unlink(capture_opts->save_file); /* silently ignore error */
1518     g_free(capture_opts->save_file);
1519   }
1520   capture_opts->save_file = NULL;
1521   capture_loop_popup_errmsg(capture_opts, errmsg);
1522
1523   /* close the input file (pcap or cap_pipe) */
1524   capture_loop_close_input(&ld);
1525
1526   g_log(LOG_DOMAIN_CAPTURE_CHILD, G_LOG_LEVEL_INFO, "Capture child stopped with error");
1527
1528   return FALSE;
1529 }
1530
1531
1532 void capture_loop_stop(void)
1533 {
1534     ld.go = FALSE;
1535 }
1536  
1537
1538 static void
1539 capture_loop_get_errmsg(char *errmsg, int errmsglen, const char *fname,
1540                           int err, gboolean is_close)
1541 {
1542   switch (err) {
1543
1544   case ENOSPC:
1545     g_snprintf(errmsg, errmsglen,
1546                 "Not all the packets could be written to the file"
1547                 " to which the capture was being saved\n"
1548                 "(\"%s\") because there is no space left on the file system\n"
1549                 "on which that file resides.",
1550                 fname);
1551     break;
1552
1553 #ifdef EDQUOT
1554   case EDQUOT:
1555     g_snprintf(errmsg, errmsglen,
1556                 "Not all the packets could be written to the file"
1557                 " to which the capture was being saved\n"
1558                 "(\"%s\") because you are too close to, or over,"
1559                 " your disk quota\n"
1560                 "on the file system on which that file resides.",
1561                 fname);
1562   break;
1563 #endif
1564
1565   case WTAP_ERR_CANT_CLOSE:
1566     g_snprintf(errmsg, errmsglen,
1567                 "The file to which the capture was being saved"
1568                 " couldn't be closed for some unknown reason.");
1569     break;
1570
1571   case WTAP_ERR_SHORT_WRITE:
1572     g_snprintf(errmsg, errmsglen,
1573                 "Not all the packets could be written to the file"
1574                 " to which the capture was being saved\n"
1575                 "(\"%s\").",
1576                 fname);
1577     break;
1578
1579   default:
1580     if (is_close) {
1581       g_snprintf(errmsg, errmsglen,
1582                 "The file to which the capture was being saved\n"
1583                 "(\"%s\") could not be closed: %s.",
1584                 fname, wtap_strerror(err));
1585     } else {
1586       g_snprintf(errmsg, errmsglen,
1587                 "An error occurred while writing to the file"
1588                 " to which the capture was being saved\n"
1589                 "(\"%s\"): %s.",
1590                 fname, wtap_strerror(err));
1591     }
1592     break;
1593   }
1594 }
1595
1596 static void
1597 capture_loop_popup_errmsg(capture_options *capture_opts _U_, const char *errmsg)
1598 {
1599     /* Send the error message to our parent, so they can display a
1600        dialog box containing it. */
1601     sync_pipe_errmsg_to_parent(errmsg);
1602 }
1603
1604
1605 /* one packet was captured, process it */
1606 static void
1607 capture_loop_packet_cb(guchar *user, const struct pcap_pkthdr *phdr,
1608   const guchar *pd)
1609 {
1610   struct wtap_pkthdr whdr;
1611   union wtap_pseudo_header pseudo_header;
1612   loop_data *ld = (loop_data *) user;
1613   int err;
1614
1615   /* if the user told us to stop after x packets, do we have enough? */
1616   ld->counts.total++;
1617   if ((ld->packets_max > 0) && (ld->counts.total >= ld->packets_max))
1618   {
1619      ld->go = FALSE;
1620   }
1621
1622   /* Convert from libpcap to Wiretap format.
1623      If that fails, set "ld->go" to FALSE, to stop the capture, and set
1624      "ld->err" to the error. */
1625   pd = wtap_process_pcap_packet(ld->wtap_linktype, phdr, pd, &pseudo_header,
1626                                 &whdr, &err);
1627   if (pd == NULL) {
1628     ld->go = FALSE;
1629     ld->err = err;
1630     return;
1631   }
1632
1633   if (ld->wtap_pdh) {
1634     /* We're supposed to write the packet to a file; do so.
1635        If this fails, set "ld->go" to FALSE, to stop the capture, and set
1636        "ld->err" to the error. */
1637     if (!wtap_dump(ld->wtap_pdh, &whdr, &pseudo_header, pd, &err)) {
1638       ld->go = FALSE;
1639       ld->err = err;
1640     }
1641   }
1642
1643   switch (ld->wtap_linktype) {
1644     case WTAP_ENCAP_ETHERNET:
1645       capture_eth(pd, 0, whdr.caplen, &ld->counts);
1646       break;
1647     case WTAP_ENCAP_FDDI:
1648     case WTAP_ENCAP_FDDI_BITSWAPPED:
1649       capture_fddi(pd, whdr.caplen, &ld->counts);
1650       break;
1651     case WTAP_ENCAP_PRISM_HEADER:
1652       capture_prism(pd, 0, whdr.caplen, &ld->counts);
1653       break;
1654     case WTAP_ENCAP_TOKEN_RING:
1655       capture_tr(pd, 0, whdr.caplen, &ld->counts);
1656       break;
1657     case WTAP_ENCAP_NULL:
1658       capture_null(pd, whdr.caplen, &ld->counts);
1659       break;
1660     case WTAP_ENCAP_PPP:
1661       capture_ppp_hdlc(pd, 0, whdr.caplen, &ld->counts);
1662       break;
1663     case WTAP_ENCAP_RAW_IP:
1664       capture_raw(pd, whdr.caplen, &ld->counts);
1665       break;
1666     case WTAP_ENCAP_SLL:
1667       capture_sll(pd, whdr.caplen, &ld->counts);
1668       break;
1669     case WTAP_ENCAP_LINUX_ATM_CLIP:
1670       capture_clip(pd, whdr.caplen, &ld->counts);
1671       break;
1672     case WTAP_ENCAP_IEEE_802_11:
1673     case WTAP_ENCAP_IEEE_802_11_WITH_RADIO:
1674       capture_ieee80211(pd, 0, whdr.caplen, &ld->counts);
1675       break;
1676     case WTAP_ENCAP_CHDLC:
1677       capture_chdlc(pd, 0, whdr.caplen, &ld->counts);
1678       break;
1679     case WTAP_ENCAP_LOCALTALK:
1680       capture_llap(&ld->counts);
1681       break;
1682     case WTAP_ENCAP_ATM_PDUS:
1683       capture_atm(&pseudo_header, pd, whdr.caplen, &ld->counts);
1684       break;
1685     case WTAP_ENCAP_IP_OVER_FC:
1686       capture_ipfc(pd, whdr.caplen, &ld->counts);
1687       break;
1688     case WTAP_ENCAP_ARCNET:
1689       capture_arcnet(pd, whdr.caplen, &ld->counts, FALSE, TRUE);
1690       break;
1691     case WTAP_ENCAP_ARCNET_LINUX:
1692       capture_arcnet(pd, whdr.caplen, &ld->counts, TRUE, FALSE);
1693       break;
1694     case WTAP_ENCAP_APPLE_IP_OVER_IEEE1394:
1695       capture_ap1394(pd, 0, whdr.caplen, &ld->counts);
1696       break;
1697     case WTAP_ENCAP_FRELAY:
1698     case WTAP_ENCAP_FRELAY_WITH_PHDR:
1699       capture_fr(pd, 0, whdr.caplen, &ld->counts);
1700       break;
1701     /* XXX - some ATM drivers on FreeBSD might prepend a 4-byte ATM
1702        pseudo-header to DLT_ATM_RFC1483, with LLC header following;
1703        we might have to implement that at some point. */
1704   }
1705 }
1706
1707 #endif /* HAVE_LIBPCAP */
1708