X-Git-Url: http://git.samba.org/samba.git/?p=obnox%2Fwireshark%2Fwip.git;a=blobdiff_plain;f=rawshark.c;h=73131c5b1de855aab0a40601b0f972930eefd045;hp=4218941eca71369f94812a8d56d66135e7b44415;hb=dbde655a4385c6ee70c9f10d04784caf734c849f;hpb=e44e7544c6768f4aca88b4d81ab5fdd8f1578fdc diff --git a/rawshark.c b/rawshark.c index 4218941eca..73131c5b1d 100644 --- a/rawshark.c +++ b/rawshark.c @@ -61,13 +61,7 @@ # include #endif -#ifdef NEED_STRERROR_H -#include "wsutil/strerror.h" -#endif - -#ifdef HAVE_GETOPT_H -#include -#else +#ifndef HAVE_GETOPT #include "wsutil/wsgetopt.h" #endif @@ -85,7 +79,7 @@ #include #include "print.h" #include -#include "util.h" +#include "ui/util.h" #include "clopts_common.h" #include "cmdarg_err.h" #include "version_info.h" @@ -112,11 +106,14 @@ #include "pcapio.h" #ifdef _WIN32 #include "capture-wpcap.h" -#include "capture_errs.h" #endif /* _WIN32 */ #endif /* HAVE_LIBPCAP */ #include "log.h" +#ifdef _WIN32 +#include +#endif /* _WIN32 */ + /* * This is the template for the decode as option; it is shared between the * various functions that output the usage for this parameter. @@ -140,6 +137,8 @@ typedef enum { static gboolean line_buffered; static print_format_e print_format = PR_FMT_TEXT; +static gboolean want_pcap_pkthdr; + cf_status_t raw_cf_open(capture_file *cf, const char *fname); static int load_cap_file(capture_file *cf); static gboolean process_packet(capture_file *cf, gint64 offset, @@ -202,25 +201,28 @@ print_usage(gboolean print_ver) fprintf(output, "\n"); fprintf(output, "Processing:\n"); - fprintf(output, " -R packet filter in Wireshark display filter syntax\n"); + fprintf(output, " -d |\n"); + fprintf(output, " packet encapsulation or protocol\n"); fprintf(output, " -F field to display\n"); - fprintf(output, " -s skip PCAP header on input\n"); fprintf(output, " -n disable all name resolution (def: all enabled)\n"); fprintf(output, " -N enable specific name resolution(s): \"mntC\"\n"); - fprintf(output, " -d |\n"); - fprintf(output, " packet encapsulation or protocol\n"); + fprintf(output, " -p use the system's packet header format\n"); + fprintf(output, " (which may have 64-bit timestamps)\n"); + fprintf(output, " -R packet filter in Wireshark display filter syntax\n"); + fprintf(output, " -s skip PCAP header on input\n"); - /*fprintf(output, "\n");*/ + fprintf(output, "\n"); fprintf(output, "Output:\n"); - fprintf(output, " -S format string for fields (%%D - name, %%S - stringval, %%N numval)\n"); - fprintf(output, " -t ad|a|r|d|dd|e output format of time stamps (def: r: rel. to first)\n"); fprintf(output, " -l flush output after each packet\n"); + fprintf(output, " -S format string for fields\n"); + fprintf(output, " (%%D - name, %%S - stringval, %%N numval)\n"); + fprintf(output, " -t ad|a|r|d|dd|e output format of time stamps (def: r: rel. to first)\n"); fprintf(output, "\n"); fprintf(output, "Miscellaneous:\n"); fprintf(output, " -h display this help and exit\n"); - fprintf(output, " -v display version info and exit\n"); fprintf(output, " -o : ... override preference setting\n"); + fprintf(output, " -v display version info and exit\n"); } static void @@ -240,7 +242,7 @@ static int raw_pipe_open(const char *pipe_name) { #ifndef _WIN32 - struct stat pipe_stat; + ws_statb64 pipe_stat; #else char *pncopy, *pos; DWORD err; @@ -265,9 +267,9 @@ raw_pipe_open(const char *pipe_name) #endif /* _WIN32 */ } else { #ifndef _WIN32 - if (ws_stat(pipe_name, &pipe_stat) < 0) { + if (ws_stat64(pipe_name, &pipe_stat) < 0) { fprintf(stderr, "rawshark: The pipe %s could not be checked: %s\n", - pipe_name, strerror(errno)); + pipe_name, g_strerror(errno)); return -1; } if (! S_ISFIFO(pipe_stat.st_mode)) { @@ -286,7 +288,7 @@ raw_pipe_open(const char *pipe_name) rfd = ws_open(pipe_name, O_RDONLY | O_NONBLOCK, 0000 /* no creation so don't matter */); if (rfd == -1) { fprintf(stderr, "rawshark: \"%s\" could not be opened: %s\n", - pipe_name, strerror(errno)); + pipe_name, g_strerror(errno)); return -1; } #else /* _WIN32 */ @@ -341,7 +343,7 @@ raw_pipe_open(const char *pipe_name) rfd = _open_osfhandle((long) hPipe, _O_RDONLY); if (rfd == -1) { fprintf(stderr, "rawshark: \"%s\" could not be opened: %s\n", - pipe_name, strerror(errno)); + pipe_name, g_strerror(errno)); return -1; } #endif /* _WIN32 */ @@ -427,7 +429,7 @@ main(int argc, char *argv[]) gboolean arg_error = FALSE; #ifdef _WIN32 - WSADATA wsaData; + WSADATA wsaData; #endif /* _WIN32 */ char *gpf_path, *pf_path; @@ -446,10 +448,14 @@ main(int argc, char *argv[]) guint fc; gboolean skip_pcap_header = FALSE; -#define OPTSTRING_INIT "d:F:hlnN:o:r:R:sS:t:v" +#define OPTSTRING_INIT "d:F:hlnN:o:pr:R:sS:t:v" static const char optstring[] = OPTSTRING_INIT; +#ifdef _WIN32 + arg_list_utf_16to8(argc, argv); +#endif /* _WIN32 */ + /* * Get credential information for later use. */ @@ -520,28 +526,28 @@ main(int argc, char *argv[]) if (gpf_path != NULL) { if (gpf_open_errno != 0) { cmdarg_err("Can't open global preferences file \"%s\": %s.", - pf_path, strerror(gpf_open_errno)); + pf_path, g_strerror(gpf_open_errno)); } if (gpf_read_errno != 0) { cmdarg_err("I/O error reading global preferences file \"%s\": %s.", - pf_path, strerror(gpf_read_errno)); + pf_path, g_strerror(gpf_read_errno)); } } if (pf_path != NULL) { if (pf_open_errno != 0) { cmdarg_err("Can't open your preferences file \"%s\": %s.", pf_path, - strerror(pf_open_errno)); + g_strerror(pf_open_errno)); } if (pf_read_errno != 0) { cmdarg_err("I/O error reading your preferences file \"%s\": %s.", - pf_path, strerror(pf_read_errno)); + pf_path, g_strerror(pf_read_errno)); } g_free(pf_path); pf_path = NULL; } /* Set the name resolution code's flags from the preferences. */ - g_resolv_flags = prefs_p->name_resolve; + gbl_resolv_flags = prefs_p->name_resolve; /* Read the disabled protocols file. */ read_disabled_protos_list(&gdp_path, &gdp_open_errno, &gdp_read_errno, @@ -549,11 +555,11 @@ main(int argc, char *argv[]) if (gdp_path != NULL) { if (gdp_open_errno != 0) { cmdarg_err("Could not open global disabled protocols file\n\"%s\": %s.", - gdp_path, strerror(gdp_open_errno)); + gdp_path, g_strerror(gdp_open_errno)); } if (gdp_read_errno != 0) { cmdarg_err("I/O error reading global disabled protocols file\n\"%s\": %s.", - gdp_path, strerror(gdp_read_errno)); + gdp_path, g_strerror(gdp_read_errno)); } g_free(gdp_path); } @@ -561,12 +567,12 @@ main(int argc, char *argv[]) if (dp_open_errno != 0) { cmdarg_err( "Could not open your disabled protocols file\n\"%s\": %s.", dp_path, - strerror(dp_open_errno)); + g_strerror(dp_open_errno)); } if (dp_read_errno != 0) { cmdarg_err( "I/O error reading your disabled protocols file\n\"%s\": %s.", dp_path, - strerror(dp_read_errno)); + g_strerror(dp_read_errno)); } g_free(dp_path); } @@ -617,12 +623,12 @@ main(int argc, char *argv[]) line_buffered = TRUE; break; case 'n': /* No name resolution */ - g_resolv_flags = RESOLV_NONE; + gbl_resolv_flags = RESOLV_NONE; break; case 'N': /* Select what types of addresses/port #s to resolve */ - if (g_resolv_flags == RESOLV_ALL) - g_resolv_flags = RESOLV_NONE; - badopt = string_to_name_resolve(optarg, &g_resolv_flags); + if (gbl_resolv_flags == RESOLV_ALL) + gbl_resolv_flags = RESOLV_NONE; + badopt = string_to_name_resolve(optarg, &gbl_resolv_flags); if (badopt != '\0') { cmdarg_err("-N specifies unknown resolving option '%c'; valid options are 'm', 'n', and 't'", badopt); @@ -647,6 +653,9 @@ main(int argc, char *argv[]) break; } break; + case 'p': /* Expect pcap_pkthdr packet headers, which may have 64-bit timestamps */ + want_pcap_pkthdr = TRUE; + break; case 'r': /* Read capture file xxx */ pipe_name = g_strdup(optarg); break; @@ -681,6 +690,10 @@ main(int argc, char *argv[]) timestamp_set_type(TS_DELTA_DIS); else if (strcmp(optarg, "e") == 0) timestamp_set_type(TS_EPOCH); + else if (strcmp(optarg, "u") == 0) + timestamp_set_type(TS_UTC); + else if (strcmp(optarg, "ud") == 0) + timestamp_set_type(TS_UTC_WITH_DATE); else { cmdarg_err("Invalid time stamp type \"%s\"", optarg); @@ -695,7 +708,7 @@ main(int argc, char *argv[]) GString *runtime_info_str; /* Assemble the compile-time version information string */ comp_info_str = g_string_new("Compiled "); - get_compiled_version_info(comp_info_str, epan_get_compiled_version_info); + get_compiled_version_info(comp_info_str, NULL, epan_get_compiled_version_info); /* Assemble the run-time version information string */ runtime_info_str = g_string_new("Running "); @@ -876,12 +889,18 @@ main(int argc, char *argv[]) */ static gboolean raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err_info, gint64 *data_offset) { - struct pcaprec_hdr hdr; + struct pcap_pkthdr mem_hdr; + struct pcaprec_hdr disk_hdr; int bytes_read = 0; - int bytes_needed = sizeof(struct pcaprec_hdr); - guchar *ptr = (guchar*)&hdr; + int bytes_needed = sizeof(disk_hdr); + guchar *ptr = (guchar*) &disk_hdr; static gchar err_str[100]; + if (want_pcap_pkthdr) { + bytes_needed = sizeof(mem_hdr); + ptr = (guchar*) &mem_hdr; + } + /* Copied from capture_loop.c */ while (bytes_needed > 0) { bytes_read = read(fd, ptr, bytes_needed); @@ -898,10 +917,18 @@ raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err ptr += bytes_read; } - phdr->ts.secs = hdr.ts_sec; - phdr->ts.nsecs = hdr.ts_usec * 1000; - phdr->caplen = bytes_needed = hdr.incl_len; - phdr->len = hdr.orig_len; + if (want_pcap_pkthdr) { + phdr->ts.secs = mem_hdr.ts.tv_sec; + phdr->ts.nsecs = mem_hdr.ts.tv_usec * 1000; + phdr->caplen = bytes_needed = mem_hdr.caplen; + phdr->len = mem_hdr.len; + } else { + phdr->ts.secs = disk_hdr.ts_sec; + phdr->ts.nsecs = disk_hdr.ts_usec * 1000; + phdr->caplen = bytes_needed = disk_hdr.incl_len; + phdr->len = disk_hdr.orig_len; + } + phdr->pkt_encap = encap; #if 0 @@ -911,7 +938,7 @@ raw_pipe_read(struct wtap_pkthdr *phdr, guchar * pd, int *err, const gchar **err printf("len: %d (%04x)\n", hdr.len, hdr.len); #endif if (bytes_needed > WTAP_MAX_PACKET_SIZE) { - *err = WTAP_ERR_BAD_RECORD; + *err = WTAP_ERR_BAD_FILE; g_snprintf(err_str, 100, "Bad packet length: %d (%04x)", bytes_needed, bytes_needed); *err_info = err_str; return FALSE; @@ -954,27 +981,32 @@ load_cap_file(capture_file *cf) switch (err) { case WTAP_ERR_UNSUPPORTED_ENCAP: - cmdarg_err("\"%s\" has a packet with a network type that Rawshark doesn't support.\n(%s)", + cmdarg_err("The file \"%s\" has a packet with a network type that Rawshark doesn't support.\n(%s)", cf->filename, err_info); break; case WTAP_ERR_CANT_READ: - cmdarg_err("An attempt to read from \"%s\" failed for some unknown reason.", + cmdarg_err("An attempt to read from the file \"%s\" failed for some unknown reason.", cf->filename); break; case WTAP_ERR_SHORT_READ: - cmdarg_err("\"%s\" appears to have been cut short in the middle of a packet.", + cmdarg_err("The file \"%s\" appears to have been cut short in the middle of a packet.", cf->filename); break; - case WTAP_ERR_BAD_RECORD: - cmdarg_err("\"%s\" appears to be damaged or corrupt.\n(%s)", + case WTAP_ERR_BAD_FILE: + cmdarg_err("The file \"%s\" appears to be damaged or corrupt.\n(%s)", + cf->filename, err_info); + break; + + case WTAP_ERR_DECOMPRESS: + cmdarg_err("The compressed file \"%s\" appears to be damaged or corrupt.\n(%s)", cf->filename, err_info); break; default: - cmdarg_err("An error occurred while reading \"%s\": %s.", + cmdarg_err("An error occurred while reading the file \"%s\": %s.", cf->filename, wtap_strerror(err)); break; } @@ -1297,6 +1329,8 @@ static gboolean print_field_value(field_info *finfo, int cmd_line_index) svalue = fvalue_get_sinteger(&finfo->value); if (hfinfo->display & BASE_RANGE_STRING) { g_string_append(label_s, rval_to_str(svalue, RVALS(hfinfo->strings), "Unknown")); + } else if (hfinfo->display & BASE_EXT_STRING) { + g_string_append(label_s, val_to_str_ext(svalue, (value_string_ext *) hfinfo->strings, "Unknown")); } else { g_string_append(label_s, val_to_str(svalue, cVALS(hfinfo->strings), "Unknown")); } @@ -1308,6 +1342,8 @@ static gboolean print_field_value(field_info *finfo, int cmd_line_index) uvalue = fvalue_get_uinteger(&finfo->value); if (!hfinfo->bitmask && hfinfo->display & BASE_RANGE_STRING) { g_string_append(label_s, rval_to_str(uvalue, RVALS(hfinfo->strings), "Unknown")); + } else if (hfinfo->display & BASE_EXT_STRING) { + g_string_append(label_s, val_to_str_ext(uvalue, (value_string_ext *) hfinfo->strings, "Unknown")); } else { g_string_append(label_s, val_to_str(uvalue, cVALS(hfinfo->strings), "Unknown")); } @@ -1509,7 +1545,7 @@ show_print_file_io_error(int err) default: cmdarg_err("An error occurred while printing packets: %s.", - strerror(err)); + g_strerror(err)); break; } } @@ -1585,7 +1621,7 @@ static void read_failure_message(const char *filename, int err) { cmdarg_err("An error occurred while reading from the file \"%s\": %s.", - filename, strerror(err)); + filename, g_strerror(err)); } /* @@ -1595,7 +1631,7 @@ static void write_failure_message(const char *filename, int err) { cmdarg_err("An error occurred while writing to the file \"%s\": %s.", - filename, strerror(err)); + filename, g_strerror(err)); } /* @@ -1628,15 +1664,6 @@ cmdarg_err_cont(const char *fmt, ...) } -/****************************************************************************************************************/ -/* other "dummies" */ -void -cf_mark_frame(capture_file *cf _U_, frame_data *frame _U_) -{ - /* shouldn't happen */ - g_assert_not_reached(); -} - /* * Editor modelines * @@ -1646,6 +1673,6 @@ cf_mark_frame(capture_file *cf _U_, frame_data *frame _U_) * indent-tabs-mode: nil * End: * - * ex: set shiftwidth=4 tabstop=8 expandtab + * ex: set shiftwidth=4 tabstop=8 expandtab: * :indentSize=4:tabSize=8:noTabs=true: */