aboutsummaryrefslogtreecommitdiffstats
path: root/editcap.c
diff options
context:
space:
mode:
authorMartin Mathieson <martin.r.mathieson@googlemail.com>2015-06-25 15:36:54 -0700
committerMartin Mathieson <martin.r.mathieson@googlemail.com>2015-06-26 00:02:31 +0000
commitdd16c55e9f830e6febf5484a7a71ca0abd05bf16 (patch)
tree784b4b4f30c7bc2f8b0a587370979aedd139b549 /editcap.c
parentd81ba670a16caa8d89482f336348dba0db5a6943 (diff)
editcap: allow command-line option to set comments for given frame numbers
Change-Id: I608d3c5f56acc58ef7b3e59821a15be49344cc35 Reviewed-on: https://code.wireshark.org/review/9154 Petri-Dish: Martin Mathieson <martin.r.mathieson@googlemail.com> Reviewed-by: Martin Mathieson <martin.r.mathieson@googlemail.com>
Diffstat (limited to 'editcap.c')
-rw-r--r--editcap.c153
1 files changed, 104 insertions, 49 deletions
diff --git a/editcap.c b/editcap.c
index 23ab60d4af..12a9e826bd 100644
--- a/editcap.c
+++ b/editcap.c
@@ -145,6 +145,10 @@ typedef struct _chop_t {
int off_end_neg;
} chop_t;
+
+/* Table of user comments */
+GTree *frames_user_comments = NULL;
+
#define MAX_SELECTIONS 512
static struct select_item selectfrm[MAX_SELECTIONS];
static int max_selected = -1;
@@ -703,6 +707,7 @@ print_usage(FILE *output)
fprintf(output, " LESS THAN <dup time window> prior to current packet.\n");
fprintf(output, " A <dup time window> is specified in relative seconds\n");
fprintf(output, " (e.g. 0.000001).\n");
+ fprintf(output, " -a <framenum>:<comment> Add or replace comment for given frame number\n");
fprintf(output, "\n");
fprintf(output, " -I <bytes to ignore> ignore the specified bytes at the beginning of\n");
fprintf(output, " the frame during MD5 hash calculation\n");
@@ -832,6 +837,15 @@ list_encap_types(void) {
g_free(encaps);
}
+/* TODO: is there the equivalent of g_direct_equal? */
+static int
+framenum_equal(gconstpointer a, gconstpointer b, gpointer user_data _U_)
+{
+ return (a != b);
+}
+
+
+
#ifdef HAVE_PLUGINS
/*
* Don't report failures to load plugins because most (non-wiretap) plugins
@@ -909,7 +923,7 @@ DIAG_ON(cast-qual)
gchar *fsuffix = NULL;
const struct wtap_pkthdr *phdr;
- struct wtap_pkthdr snap_phdr;
+ struct wtap_pkthdr temp_phdr;
wtapng_iface_descriptions_t *idb_inf;
wtapng_section_t *shb_hdr;
@@ -963,8 +977,29 @@ DIAG_ON(cast-qual)
#endif
/* Process the options */
- while ((opt = getopt_long(argc, argv, "A:B:c:C:dD:E:F:hi:I:Lrs:S:t:T:vVw:", long_options, NULL)) != -1) {
+ while ((opt = getopt_long(argc, argv, "a:A:B:c:C:dD:E:F:hi:I:Lrs:S:t:T:vVw:", long_options, NULL)) != -1) {
switch (opt) {
+ case 'a':
+ {
+ guint frame_number;
+ gint string_start_index = 0;
+
+ if ((sscanf(optarg, "%u:%n", &frame_number, &string_start_index) < 1) || (string_start_index == 0)) {
+ fprintf(stderr, "editcap: \"%s\" isn't a valid <frame>:<comment>\n\n",
+ optarg);
+ exit(1);
+ }
+
+ /* Lazily create the table */
+ if (!frames_user_comments) {
+ frames_user_comments = g_tree_new_full(framenum_equal, NULL, NULL, g_free);
+ }
+
+ /* Insert this entry (framenum -> comment) */
+ g_tree_replace(frames_user_comments, GUINT_TO_POINTER(frame_number), g_strdup(optarg+string_start_index));
+ break;
+ }
+
case 'A':
{
struct tm starttm;
@@ -1188,7 +1223,7 @@ DIAG_ON(cast-qual)
exit(1);
break;
}
- }
+ } /* processing commmand-line options */
#ifdef DEBUG
fprintf(stderr, "Optind = %i, argc = %i\n", optind, argc);
@@ -1265,12 +1300,14 @@ DIAG_ON(cast-qual)
}
}
+ /* Read all of the packets in turn */
while (wtap_read(wth, &err, &err_info, &data_offset)) {
read_count++;
phdr = wtap_phdr(wth);
- if (read_count == 1) { /* the first packet */
+ /* Extra actions for the first packet */
+ if (read_count == 1) {
if (split_packet_count > 0 || secs_per_block > 0) {
if (!fileset_extract_prefix_suffix(argv[optind+1], &fprefix, &fsuffix))
exit(2);
@@ -1295,7 +1332,8 @@ DIAG_ON(cast-qual)
filename, wtap_strerror(err));
exit(2);
}
- }
+ } /* first packet only handling */
+
buf = wtap_buf_ptr(wth);
@@ -1338,7 +1376,7 @@ DIAG_ON(cast-qual)
}
}
}
- }
+ } /* time stamp handling */
if (split_packet_count > 0) {
/* time for the next file? */
@@ -1365,7 +1403,7 @@ DIAG_ON(cast-qual)
exit(2);
}
}
- }
+ } /* split packet handling */
if (check_startstop) {
/*
@@ -1399,23 +1437,23 @@ DIAG_ON(cast-qual)
/* Limit capture length to snaplen */
if (phdr->caplen > snaplen) {
/* Copy and change rather than modify returned phdr */
- snap_phdr = *phdr;
- snap_phdr.caplen = snaplen;
- phdr = &snap_phdr;
+ temp_phdr = *phdr;
+ temp_phdr.caplen = snaplen;
+ phdr = &temp_phdr;
}
/* If -L, also set reported length to snaplen */
if (adjlen && phdr->len > snaplen) {
/* Copy and change rather than modify returned phdr */
- snap_phdr = *phdr;
- snap_phdr.len = snaplen;
- phdr = &snap_phdr;
+ temp_phdr = *phdr;
+ temp_phdr.len = snaplen;
+ phdr = &temp_phdr;
}
}
/* CHOP */
- snap_phdr = *phdr;
- handle_chopping(chop, &snap_phdr, phdr, &buf, adjlen);
- phdr = &snap_phdr;
+ temp_phdr = *phdr;
+ handle_chopping(chop, &temp_phdr, phdr, &buf, adjlen);
+ phdr = &temp_phdr;
if (phdr->presence_flags & WTAP_HAS_TS) {
/* Do we adjust timestamps to ensure strict chronological
@@ -1440,17 +1478,17 @@ DIAG_ON(cast-qual)
* chronological order (oldest to newest).
*/
/* fprintf(stderr, "++out of order, need to adjust this packet!\n"); */
- snap_phdr = *phdr;
- snap_phdr.ts.secs = previous_time.secs + strict_time_adj.tv.secs;
- snap_phdr.ts.nsecs = previous_time.nsecs;
- if (snap_phdr.ts.nsecs + strict_time_adj.tv.nsecs > ONE_BILLION) {
+ temp_phdr = *phdr;
+ temp_phdr.ts.secs = previous_time.secs + strict_time_adj.tv.secs;
+ temp_phdr.ts.nsecs = previous_time.nsecs;
+ if (temp_phdr.ts.nsecs + strict_time_adj.tv.nsecs > ONE_BILLION) {
/* carry */
- snap_phdr.ts.secs++;
- snap_phdr.ts.nsecs += strict_time_adj.tv.nsecs - ONE_BILLION;
+ temp_phdr.ts.secs++;
+ temp_phdr.ts.nsecs += strict_time_adj.tv.nsecs - ONE_BILLION;
} else {
- snap_phdr.ts.nsecs += strict_time_adj.tv.nsecs;
+ temp_phdr.ts.nsecs += strict_time_adj.tv.nsecs;
}
- phdr = &snap_phdr;
+ phdr = &temp_phdr;
}
} else {
/*
@@ -1458,17 +1496,17 @@ DIAG_ON(cast-qual)
* Unconditionally set each timestamp to previous
* packet's timestamp plus delta.
*/
- snap_phdr = *phdr;
- snap_phdr.ts.secs = previous_time.secs + strict_time_adj.tv.secs;
- snap_phdr.ts.nsecs = previous_time.nsecs;
- if (snap_phdr.ts.nsecs + strict_time_adj.tv.nsecs > ONE_BILLION) {
+ temp_phdr = *phdr;
+ temp_phdr.ts.secs = previous_time.secs + strict_time_adj.tv.secs;
+ temp_phdr.ts.nsecs = previous_time.nsecs;
+ if (temp_phdr.ts.nsecs + strict_time_adj.tv.nsecs > ONE_BILLION) {
/* carry */
- snap_phdr.ts.secs++;
- snap_phdr.ts.nsecs += strict_time_adj.tv.nsecs - ONE_BILLION;
+ temp_phdr.ts.secs++;
+ temp_phdr.ts.nsecs += strict_time_adj.tv.nsecs - ONE_BILLION;
} else {
- snap_phdr.ts.nsecs += strict_time_adj.tv.nsecs;
+ temp_phdr.ts.nsecs += strict_time_adj.tv.nsecs;
}
- phdr = &snap_phdr;
+ phdr = &temp_phdr;
}
}
previous_time.secs = phdr->ts.secs;
@@ -1478,36 +1516,36 @@ DIAG_ON(cast-qual)
/* assume that if the frame's tv_sec is 0, then
* the timestamp isn't supported */
if (phdr->ts.secs > 0 && time_adj.tv.secs != 0) {
- snap_phdr = *phdr;
+ temp_phdr = *phdr;
if (time_adj.is_negative)
- snap_phdr.ts.secs -= time_adj.tv.secs;
+ temp_phdr.ts.secs -= time_adj.tv.secs;
else
- snap_phdr.ts.secs += time_adj.tv.secs;
- phdr = &snap_phdr;
+ temp_phdr.ts.secs += time_adj.tv.secs;
+ phdr = &temp_phdr;
}
/* assume that if the frame's tv_sec is 0, then
* the timestamp isn't supported */
if (phdr->ts.secs > 0 && time_adj.tv.nsecs != 0) {
- snap_phdr = *phdr;
+ temp_phdr = *phdr;
if (time_adj.is_negative) { /* subtract */
- if (snap_phdr.ts.nsecs < time_adj.tv.nsecs) { /* borrow */
- snap_phdr.ts.secs--;
- snap_phdr.ts.nsecs += ONE_BILLION;
+ if (temp_phdr.ts.nsecs < time_adj.tv.nsecs) { /* borrow */
+ temp_phdr.ts.secs--;
+ temp_phdr.ts.nsecs += ONE_BILLION;
}
- snap_phdr.ts.nsecs -= time_adj.tv.nsecs;
+ temp_phdr.ts.nsecs -= time_adj.tv.nsecs;
} else { /* add */
- if (snap_phdr.ts.nsecs + time_adj.tv.nsecs > ONE_BILLION) {
+ if (temp_phdr.ts.nsecs + time_adj.tv.nsecs > ONE_BILLION) {
/* carry */
- snap_phdr.ts.secs++;
- snap_phdr.ts.nsecs += time_adj.tv.nsecs - ONE_BILLION;
+ temp_phdr.ts.secs++;
+ temp_phdr.ts.nsecs += time_adj.tv.nsecs - ONE_BILLION;
} else {
- snap_phdr.ts.nsecs += time_adj.tv.nsecs;
+ temp_phdr.ts.nsecs += time_adj.tv.nsecs;
}
}
- phdr = &snap_phdr;
+ phdr = &temp_phdr;
}
- }
+ } /* time stamp adjustment */
/* suppress duplicates by packet window */
if (dup_detect) {
@@ -1533,7 +1571,7 @@ DIAG_ON(cast-qual)
fprintf(stderr, "\n");
}
}
- }
+ } /* suppression of duplicates */
if (phdr->presence_flags & WTAP_HAS_TS) {
/* suppress duplicates by time window */
@@ -1566,7 +1604,7 @@ DIAG_ON(cast-qual)
}
}
}
- }
+ } /* suppress duplicates by time window */
/* Random error mutation */
if (err_prob > 0.0) {
@@ -1616,8 +1654,21 @@ DIAG_ON(cast-qual)
}
}
}
+ } /* random error mutation */
+
+ /* Find a packet comment we may need to write */
+ if (frames_user_comments) {
+ const char *comment =
+ (const char*)g_tree_lookup(frames_user_comments, GUINT_TO_POINTER(read_count));
+ if (comment != NULL) {
+ /* Copy and change rather than modify returned phdr */
+ temp_phdr = *phdr;
+ temp_phdr.opt_comment = g_strdup(comment);
+ phdr = &temp_phdr;
+ }
}
+ /* Attempt to dump out current frame to the output file */
if (!wtap_dump(pdh, phdr, buf, &err, &err_info)) {
switch (err) {
case WTAP_ERR_UNWRITABLE_ENCAP:
@@ -1727,6 +1778,10 @@ DIAG_ON(cast-qual)
}
g_free(shb_hdr);
g_free(filename);
+
+ if (frames_user_comments) {
+ g_tree_destroy(frames_user_comments);
+ }
}
if (dup_detect) {