aboutsummaryrefslogtreecommitdiffstats
path: root/tethereal.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-03-01 01:21:51 +0000
committerGuy Harris <guy@alum.mit.edu>2006-03-01 01:21:51 +0000
commitaed93fa46a3e16ac8c48aa562be70eec4b5ff81d (patch)
treec54637e0861b0e1cea3ec45c6ff1251e8ef133fb /tethereal.c
parent214dc565e079775125e1b953f6ca57be002d3847 (diff)
Reject attempts to use packet capture options when we're reading a saved
capture file. We don't support saving live captures in any format other than libpcap format (and probably don't want to - we really want to avoid using Wiretap in that case, as it requires us to Wiretapify captured packets, which adds extra processing to the capture path); reject attempts to do that. svn path=/trunk/; revision=17436
Diffstat (limited to 'tethereal.c')
-rw-r--r--tethereal.c110
1 files changed, 78 insertions, 32 deletions
diff --git a/tethereal.c b/tethereal.c
index 672462ad8f..ca9cafee62 100644
--- a/tethereal.c
+++ b/tethereal.c
@@ -155,7 +155,7 @@ static gboolean infoprint; /* if TRUE, print capture info after clearing infodel
#endif /* HAVE_LIBPCAP */
-static int capture(int);
+static int capture(void);
static void capture_pcap_cb(u_char *, const struct pcap_pkthdr *,
const u_char *);
static void report_counts(void);
@@ -1169,40 +1169,86 @@ main(int argc, char *argv[])
exit(1);
}
- if (capture_opts.multi_files_on) {
- /* Multiple-file mode works only under certain conditions:
- a) it doesn't work if you're not saving the capture to a file;
- b) it doesn't work if you're writing to the standard output;
- c) it doesn't work if you're writing to a pipe;
- d) it only works if you're saving in libpcap format;
- e) it makes no sense if the maximum file size is set to "infinite"
- (XXX - shouldn't that be "if there is no stop criterion",
- as you might want to switch files based on a packet count
- or a time). */
- if (capture_opts.save_file == NULL) {
- cmdarg_err("Multiple capture files requested, but "
- "the capture isn't being saved to a file.");
- exit(1);
+ if (cf_name) {
+ /*
+ * "-r" was specified, so we're reading a capture file.
+ * Capture options don't apply here.
+ */
+ if (capture_opts.multi_files_on) {
+ cmdarg_err("Multiple capture files requested, but "
+ "a capture isn't being done.");
+ exit(1);
}
- if (strcmp(capture_opts.save_file, "-") == 0) {
- cmdarg_err("Multiple capture files requested, but "
- "the capture is being written to the standard output.");
- exit(1);
+ if (capture_opts.has_file_duration) {
+ cmdarg_err("Switching capture files after a time interval was specified, but "
+ "a capture isn't being done.");
+ exit(1);
}
- if (capture_opts.output_to_pipe) {
- cmdarg_err("Multiple capture files requested, but "
- "the capture file is a pipe.");
- exit(1);
+ if (capture_opts.has_ring_num_files) {
+ cmdarg_err("A ring buffer of capture files was specified, but "
+ "a capture isn't being done.");
+ exit(1);
+ }
+ if (capture_opts.has_autostop_files) {
+ cmdarg_err("A maximum number of capture files was specified, but "
+ "a capture isn't being done.");
+ exit(1);
+ }
+ if (capture_opts.has_autostop_packets) {
+ cmdarg_err("A maximum number of captured packets was specified, but "
+ "a capture isn't being done.");
+ exit(1);
}
+ if (capture_opts.has_autostop_filesize) {
+ cmdarg_err("A maximum capture file size was specified, but "
+ "a capture isn't being done.");
+ exit(1);
+ }
+ if (capture_opts.has_autostop_duration) {
+ cmdarg_err("A maximum capture time was specified, but "
+ "a capture isn't being done.");
+ exit(1);
+ }
+ } else {
+ /*
+ * "-r" wasn't specified, so we're doing a live capture.
+ * We only support doing that in libpcap format.
+ */
if (out_file_type != WTAP_FILE_PCAP) {
- cmdarg_err("Multiple capture files requested, but "
- "the capture isn't being saved in libpcap format.");
+ cmdarg_err("A capture is being done; captures can only be "
+ "saved in libpcap format.");
exit(1);
}
- if (!capture_opts.has_autostop_filesize) {
- cmdarg_err("Multiple capture files requested, but "
- "no maximum capture file size was specified.");
- exit(1);
+ if (capture_opts.multi_files_on) {
+ /* Multiple-file mode works only under certain conditions:
+ a) it doesn't work if you're not saving the capture to a file;
+ b) it doesn't work if you're writing to the standard output;
+ c) it doesn't work if you're writing to a pipe;
+ d) it only works if you're saving in libpcap format;
+ e) it makes no sense if the maximum file size is set to "infinite"
+ (XXX - shouldn't that be "if there is no stop criterion",
+ as you might want to switch files based on a packet count
+ or a time). */
+ if (capture_opts.save_file == NULL) {
+ cmdarg_err("Multiple capture files requested, but "
+ "the capture isn't being saved to a file.");
+ exit(1);
+ }
+ if (strcmp(capture_opts.save_file, "-") == 0) {
+ cmdarg_err("Multiple capture files requested, but "
+ "the capture is being written to the standard output.");
+ exit(1);
+ }
+ if (capture_opts.output_to_pipe) {
+ cmdarg_err("Multiple capture files requested, but "
+ "the capture file is a pipe.");
+ exit(1);
+ }
+ if (!capture_opts.has_autostop_filesize) {
+ cmdarg_err("Multiple capture files requested, but "
+ "no maximum capture file size was specified.");
+ exit(1);
+ }
}
}
}
@@ -1408,7 +1454,7 @@ main(int argc, char *argv[])
/* For now, assume libpcap gives microsecond precision. */
timestamp_set_precision(TS_PREC_AUTO_USEC);
- capture(out_file_type);
+ capture();
if (capture_opts.multi_files_on) {
ringbuf_free();
@@ -1434,7 +1480,7 @@ main(int argc, char *argv[])
static condition *volatile cnd_file_duration = NULL; /* this must be visible in process_packet */
static int
-capture(int out_file_type)
+capture(void)
{
int err = 0;
int volatile volatile_err = 0;
@@ -2815,7 +2861,7 @@ cf_open(capture_file *cf, const char *fname, gboolean is_tempfile, int *err)
fail:
g_snprintf(err_msg, sizeof err_msg,
- cf_open_error_message(*err, err_info, FALSE, 0), fname);
+ cf_open_error_message(*err, err_info, FALSE, cf->cd_t), fname);
cmdarg_err("%s", err_msg);
return CF_ERROR;
}