/* Edit capture files. We can delete records, adjust timestamps, or * simply convert from one format to another format. * * $Id$ * * Originally written by Richard Sharpe. * Improved by Guy Harris. * Further improved by Richard Sharpe. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifdef HAVE_UNISTD_H #include #endif #include #ifdef HAVE_SYS_TIME_H #include #endif #include #include "wtap.h" #ifdef NEED_GETOPT_H #include "getopt.h" #endif #ifdef _WIN32 #include /* getpid */ #endif /* * Some globals so we can pass things to various routines */ struct select_item { int inclusive; int first, second; }; #define ONE_MILLION 1000000 /* Weights of different errors we can introduce */ /* We should probably make these command-line arguments */ /* XXX - Should we add a bit-level error? */ #define ERR_WT_BIT 5 /* Flip a random bit */ #define ERR_WT_BYTE 5 /* Substitute a random byte */ #define ERR_WT_ALNUM 5 /* Substitute a random character in [A-Za-z0-9] */ #define ERR_WT_FMT 2 /* Substitute "%s" */ #define ERR_WT_AA 1 /* Fill the remainder of the buffer with 0xAA */ #define ERR_WT_TOTAL (ERR_WT_BIT + ERR_WT_BYTE + ERR_WT_ALNUM + ERR_WT_FMT + ERR_WT_AA) #define ALNUM_CHARS "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" #define ALNUM_LEN (sizeof(ALNUM_CHARS) - 1) struct time_adjustment { struct timeval tv; int is_negative; }; static struct select_item selectfrm[100]; static int max_selected = -1; static int keep_em = 0; static int out_file_type = WTAP_FILE_PCAP; /* default to "libpcap" */ static int out_frame_type = -2; /* Leave frame type alone */ static int verbose = 0; /* Not so verbose */ static struct time_adjustment time_adj = {{0, 0}, 0}; /* no adjustment */ static double err_prob = 0.0; /* Add a selection item, a simple parser for now */ static void add_selection(char *sel) { char *locn; char *next; if (max_selected == (sizeof(selectfrm)/sizeof(struct select_item)) - 1) return; printf("Add_Selected: %s\n", sel); if ((locn = strchr(sel, '-')) == NULL) { /* No dash, so a single number? */ printf("Not inclusive ..."); max_selected++; selectfrm[max_selected].inclusive = 0; selectfrm[max_selected].first = atoi(sel); printf(" %i\n", selectfrm[max_selected].first); } else { printf("Inclusive ..."); next = locn + 1; max_selected++; selectfrm[max_selected].inclusive = 1; selectfrm[max_selected].first = atoi(sel); selectfrm[max_selected].second = atoi(next); printf(" %i, %i\n", selectfrm[max_selected].first, selectfrm[max_selected].second); } } /* Was the record selected? */ static int selected(int recno) { int i = 0; for (i = 0; i<= max_selected; i++) { if (selectfrm[i].inclusive) { if (selectfrm[i].first <= recno && selectfrm[i].second >= recno) return 1; } else { if (recno == selectfrm[i].first) return 1; } } return 0; } static void set_time_adjustment(char *optarg) { char *frac, *end; long val; int frac_digits; if (!optarg) return; /* skip leading whitespace */ while (*optarg == ' ' || *optarg == '\t') { optarg++; } /* check for a negative adjustment */ if (*optarg == '-') { time_adj.is_negative = 1; optarg++; } /* collect whole number of seconds, if any */ if (*optarg == '.') { /* only fractional (i.e., .5 is ok) */ val = 0; frac = optarg; } else { val = strtol(optarg, &frac, 10); if (frac == NULL || frac == optarg || val == LONG_MIN || val == LONG_MAX) { fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n", optarg); exit(1); } if (val < 0) { /* implies '--' since we caught '-' above */ fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n", optarg); exit(1); } } time_adj.tv.tv_sec = val; /* now collect the partial seconds, if any */ if (*frac != '\0') { /* chars left, so get fractional part */ val = strtol(&(frac[1]), &end, 10); if (*frac != '.' || end == NULL || end == frac || val < 0 || val > ONE_MILLION || val == LONG_MIN || val == LONG_MAX) { fprintf(stderr, "editcap: \"%s\" isn't a valid time adjustment\n", optarg); exit(1); } } else { return; /* no fractional digits */ } /* adjust fractional portion from fractional to numerator * e.g., in "1.5" from 5 to 500000 since .5*10^6 = 500000 */ if (frac && end) { /* both are valid */ frac_digits = end - frac - 1; /* fractional digit count (remember '.') */ while(frac_digits < 6) { /* this is frac of 10^6 */ val *= 10; frac_digits++; } } time_adj.tv.tv_usec = val; } static void usage(void) { int i; const char *string; fprintf(stderr, "Usage: editcap [-r] [-h] [-v] [-T ] [-E ]\n"); fprintf(stderr, " [-F ] [-s ] [-t