#include <grp.h>
#endif /* _WIN32 */
+/*
+ * Pathname separator.
+ * Use this in pathnames, but do *not* use it in URLs.
+ */
+#ifdef _WIN32
+#define PATH_SEPARATOR '\\'
+#else
+#define PATH_SEPARATOR '/'
+#endif
+
/* capabilities convenience library */
/* If a code depends on HAVE_LIBCAP_NG, it depends also on HAVE_CAP_NG_H.
* If HAVE_CAP_NG_H is not defined, undefine HAVE_LIBCAP_NG.
static void (*setsignal (int sig, void (*func)(int)))(int);
static void cleanup(int);
static void child_cleanup(int);
-static void print_version(void);
-static void print_usage(void);
+static void print_version(FILE *);
+static void print_usage(FILE *);
#ifdef HAVE_PCAP_SET_TSTAMP_TYPE
static NORETURN void show_tstamp_types_and_exit(pcap_t *, const char *device);
#endif
VFile = NULL;
WFileName = NULL;
dlt = -1;
- if ((cp = strrchr(argv[0], '/')) != NULL)
+ if ((cp = strrchr(argv[0], PATH_SEPARATOR)) != NULL)
ndo->program_name = program_name = cp + 1;
else
ndo->program_name = program_name = argv[0];
break;
case 'h':
- print_usage();
+ print_usage(stdout);
exit_tcpdump(S_SUCCESS);
break;
break;
case OPTION_VERSION:
- print_version();
+ print_version(stdout);
exit_tcpdump(S_SUCCESS);
break;
break;
default:
- print_usage();
+ print_usage(stderr);
exit_tcpdump(S_ERR_HOST_PROGRAM);
/* NOTREACHED */
}
show_remote_devices_and_exit();
#endif
+#if defined(DLT_LINUX_SLL2) && defined(HAVE_PCAP_SET_DATALINK)
+/* Set default linktype DLT_LINUX_SLL2 when capturing on the "any" device */
+ if (device != NULL &&
+ strncmp (device, "any", strlen("any")) == 0
+ && yflag_dlt == -1)
+ yflag_dlt = DLT_LINUX_SLL2;
+#endif
+
switch (ndo->ndo_tflag) {
case 0: /* Default */
}
#endif
(void)fprintf(stderr, "%s: data link type %s\n",
- program_name, yflag_dlt_name);
+ program_name,
+ pcap_datalink_val_to_name(yflag_dlt));
(void)fflush(stderr);
}
i = pcap_snapshot(pd);
}
if (print) {
dlt = pcap_datalink(pd);
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
dumpinfo.ndo = ndo;
} else
dumpinfo.ndo = NULL;
#endif
} else {
dlt = pcap_datalink(pd);
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
callback = print_packet;
pcap_userdata = (u_char *)ndo;
}
(void)setsignal(SIGNAL_FLUSH_PCAP, flushpcap);
#endif
- if (ndo->ndo_vflag > 0 && WFileName && !print) {
+ if (ndo->ndo_vflag > 0 && WFileName && RFileName == NULL && !print) {
/*
* When capturing to a file, if "--print" wasn't specified,
*"-v" means tcpdump should, once per second,
* "v"erbosely report the number of packets captured.
+ * Except when reading from a file, because -r, -w and -v
+ * together used to make a corner case, in which pcap_loop()
+ * errored due to EINTR (see GH #155 for details).
*/
#ifdef _WIN32
/*
*/
if (!ndo->ndo_vflag && !WFileName) {
(void)fprintf(stderr,
- "%s: verbose output suppressed, use -v or -vv for full protocol decode\n",
+ "%s: verbose output suppressed, use -v[v]... for full protocol decode\n",
program_name);
} else
(void)fprintf(stderr, "%s: ", program_name);
* the new DLT.
*/
dlt = new_dlt;
- ndo->ndo_if_printer = get_if_printer(ndo, dlt);
+ ndo->ndo_if_printer = get_if_printer(dlt);
if (pcap_compile(pd, &fcode, cmdbuf, Oflag, netmask) < 0)
error("%s", pcap_geterr(pd));
}
USES_APPLE_DEPRECATED_API
static void
-print_version(void)
+print_version(FILE *f)
{
#ifndef HAVE_PCAP_LIB_VERSION
#ifdef HAVE_PCAP_VERSION
#endif /* HAVE_PCAP_LIB_VERSION */
const char *smi_version_string;
- (void)fprintf(stderr, "%s version " PACKAGE_VERSION "\n", program_name);
+ (void)fprintf(f, "%s version " PACKAGE_VERSION "\n", program_name);
#ifdef HAVE_PCAP_LIB_VERSION
- (void)fprintf(stderr, "%s\n", pcap_lib_version());
+ (void)fprintf(f, "%s\n", pcap_lib_version());
#else /* HAVE_PCAP_LIB_VERSION */
- (void)fprintf(stderr, "libpcap version %s\n", pcap_version);
+ (void)fprintf(f, "libpcap version %s\n", pcap_version);
#endif /* HAVE_PCAP_LIB_VERSION */
#if defined(HAVE_LIBCRYPTO) && defined(SSLEAY_VERSION)
- (void)fprintf (stderr, "%s\n", SSLeay_version(SSLEAY_VERSION));
+ (void)fprintf (f, "%s\n", SSLeay_version(SSLEAY_VERSION));
#endif
smi_version_string = nd_smi_version_string();
if (smi_version_string != NULL)
- (void)fprintf (stderr, "SMI-library: %s\n", smi_version_string);
+ (void)fprintf (f, "SMI-library: %s\n", smi_version_string);
#if defined(__SANITIZE_ADDRESS__)
- (void)fprintf (stderr, "Compiled with AddressSanitizer/GCC.\n");
+ (void)fprintf (f, "Compiled with AddressSanitizer/GCC.\n");
#elif defined(__has_feature)
# if __has_feature(address_sanitizer)
- (void)fprintf (stderr, "Compiled with AddressSanitizer/CLang.\n");
+ (void)fprintf (f, "Compiled with AddressSanitizer/Clang.\n");
+# elif __has_feature(memory_sanitizer)
+ (void)fprintf (f, "Compiled with MemorySanitizer/Clang.\n");
# endif
#endif /* __SANITIZE_ADDRESS__ or __has_feature */
}
USES_APPLE_RST
static void
-print_usage(void)
+print_usage(FILE *f)
{
- print_version();
- (void)fprintf(stderr,
+ print_version(f);
+ (void)fprintf(f,
"Usage: %s [-Abd" D_FLAG "efhH" I_FLAG J_FLAG "KlLnNOpqStu" U_FLAG "vxX#]" B_FLAG_USAGE " [ -c count ] [--count]\n", program_name);
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]\n");
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -i interface ]" IMMEDIATE_MODE_USAGE j_FLAG_USAGE "\n");
#ifdef HAVE_PCAP_FINDALLDEVS_EX
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t" LIST_REMOTE_INTERFACES_USAGE "\n");
#endif
#ifdef USE_LIBSMI
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t" m_FLAG_USAGE "\n");
#endif
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -M secret ] [ --number ] [ --print ]" Q_FLAG_USAGE "\n");
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -r file ] [ -s snaplen ] [ -T type ] [ --version ]\n");
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]\n");
#ifdef HAVE_PCAP_SET_TSTAMP_PRECISION
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ --time-stamp-precision precision ] [ --micro ] [ --nano ]\n");
#endif
- (void)fprintf(stderr,
+ (void)fprintf(f,
"\t\t[ -z postrotate-command ] [ -Z user ] [ expression ]\n");
}