Skip to content

Commit

Permalink
Allow a platform to add information to the version string.
Browse files Browse the repository at this point in the history
For example, on Linux, we add information about memory-mapped capture
support; see comments on GitHub issue the-tcpdump-group#600.
  • Loading branch information
guyharris committed May 16, 2017
1 parent cbffeae commit a8578d4
Show file tree
Hide file tree
Showing 16 changed files with 194 additions and 12 deletions.
13 changes: 13 additions & 0 deletions pcap-bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -3149,3 +3149,16 @@ pcap_set_datalink_bpf(pcap_t *p, int dlt)
#endif
return (0);
}

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
#ifdef HAVE_ZEROCOPY_BPF
return ("with zerocopy support");
#else
return (NULL);
#endif
}
9 changes: 9 additions & 0 deletions pcap-dag.c
Original file line number Diff line number Diff line change
Expand Up @@ -1348,4 +1348,13 @@ pcap_create_interface(const char *device, char *errbuf)
"This version of libpcap only supports DAG cards");
return NULL;
}

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return ("DAG-only");
}
#endif
9 changes: 9 additions & 0 deletions pcap-dlpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1835,3 +1835,12 @@ pcap_create_interface(const char *device _U_, char *ebuf)
p->activate_op = pcap_activate_dlpi;
return (p);
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
8 changes: 8 additions & 0 deletions pcap-int.h
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,14 @@ int pcap_getnonblock_fd(pcap_t *);
int pcap_setnonblock_fd(pcap_t *p, int);
#endif

/*
* Internal interfaces for "pcap_lib_version()".
*
* "pcap_platform_lib_version()" returns platform-specific version
* information, or NULL if there isn't any.
*/
const char *pcap_platform_lib_version(void);

/*
* Internal interfaces for "pcap_create()".
*
Expand Down
9 changes: 9 additions & 0 deletions pcap-libdlpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -450,3 +450,12 @@ pcap_create_interface(const char *device _U_, char *ebuf)
p->activate_op = pcap_activate_libdlpi;
return (p);
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
19 changes: 19 additions & 0 deletions pcap-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -6916,3 +6916,22 @@ reset_kernel_filter(pcap_t *handle)
return 0;
}
#endif

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
#ifdef HAVE_PACKET_RING
#if defined(HAVE_TPACKET3)
return ("with TPACKET_V{1,2,3} support");
#elif defined(HAVE_TPACKET2)
return ("with TPACKET_V{1,2} support");
#else
return ("with TPACKET_V1 support");
#endif
#else
return ("without TPACKET support");
#endif
}
9 changes: 9 additions & 0 deletions pcap-nit.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,3 +382,12 @@ pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
9 changes: 9 additions & 0 deletions pcap-null.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,12 @@ pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
*/
return (0);
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
9 changes: 9 additions & 0 deletions pcap-pf.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,3 +620,12 @@ pcap_setfilter_pf(pcap_t *p, struct bpf_program *fp)
pf->filtering_in_kernel = 0;
return (0);
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
9 changes: 9 additions & 0 deletions pcap-septel.c
Original file line number Diff line number Diff line change
Expand Up @@ -319,4 +319,13 @@ pcap_create_interface(const char *device, char *errbuf)
"This version of libpcap only supports Septel cards");
return (NULL);
}

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return ("Septel-only");
}
#endif
9 changes: 9 additions & 0 deletions pcap-sita.c
Original file line number Diff line number Diff line change
Expand Up @@ -1047,3 +1047,12 @@ int pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf) {
//printf("pcap_findalldevs() returning ZERO OK\n"); // fulko
return 0;
}

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return ("SITA-only");
}
9 changes: 9 additions & 0 deletions pcap-snf.c
Original file line number Diff line number Diff line change
Expand Up @@ -582,4 +582,13 @@ pcap_create_interface(const char *device, char *errbuf)
"This version of libpcap only supports SNF cards");
return NULL;
}

/*
* Platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return ("SNF-only");
}
#endif
9 changes: 9 additions & 0 deletions pcap-snit.c
Original file line number Diff line number Diff line change
Expand Up @@ -458,3 +458,12 @@ pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
9 changes: 9 additions & 0 deletions pcap-snoop.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,3 +433,12 @@ pcap_platform_finddevs(pcap_if_list_t *devlistp, char *errbuf)
{
return (pcap_findalldevs_interfaces(devlistp, errbuf, can_be_bound));
}

/*
* No platform-specific information.
*/
const char *
pcap_platform_lib_version(void)
{
return (NULL);
}
64 changes: 52 additions & 12 deletions pcap.c
Original file line number Diff line number Diff line change
Expand Up @@ -2963,9 +2963,9 @@ pcap_offline_filter(const struct bpf_program *fp, const struct pcap_pkthdr *h,

#include "pcap_version.h"

#ifdef _WIN32
static const char *pcap_lib_version_string;

static char *full_pcap_version_string;
#ifdef _WIN32

#ifdef HAVE_VERSION_H
/*
Expand All @@ -2990,8 +2990,9 @@ pcap_lib_version(void)
{
char *packet_version_string;
size_t full_pcap_version_string_len;
char *full_pcap_version_string;

if (full_pcap_version_string == NULL) {
if (pcap_lib_version_string == NULL) {
/*
* Generate the version string.
*/
Expand Down Expand Up @@ -3038,8 +3039,9 @@ pcap_lib_version(void)
packet_version_string,
pcap_version_string);
}
pcap_lib_version_string = full_pcap_version_string;
}
return (full_pcap_version_string);
return (pcap_lib_version_string);
}

#else /* HAVE_VERSION_H */
Expand All @@ -3055,8 +3057,9 @@ pcap_lib_version(void)
{
char *packet_version_string;
size_t full_pcap_version_string_len;
char *full_pcap_version_string;

if (full_pcap_version_string == NULL) {
if (pcap_lib_version_string == NULL) {
/*
* Generate the version string. Report the packet.dll
* version.
Expand All @@ -3074,24 +3077,24 @@ pcap_lib_version(void)
pcap_version_string_packet_dll_fmt,
pcap_version_string,
packet_version_string);
pcap_lib_version_string = full_pcap_version_string;
}
return (full_pcap_version_string);
return (pcap_lib_version_string);
}

#endif /* HAVE_VERSION_H */

#elif defined(MSDOS)

static char *full_pcap_version_string;

const char *
pcap_lib_version (void)
pcap_lib_version(void)
{
char *packet_version_string;
size_t full_pcap_version_string_len;
char *full_pcap_version_string;
static char dospfx[] = "DOS-";

if (full_pcap_version_string == NULL) {
if (pcap_lib_version_string == NULL) {
/*
* Generate the version string.
*/
Expand All @@ -3103,16 +3106,53 @@ pcap_lib_version (void)
return (NULL);
strcpy(full_pcap_version_string, dospfx);
strcat(full_pcap_version_string, pcap_version_string);
pcap_lib_version_string = full_pcap_version_string;
}
return (full_pcap_version_string);
return (pcap_lib_version_string);
}

#else /* UN*X */

const char *
pcap_lib_version(void)
{
return (pcap_version_string);
const char *platform_version_string;
size_t full_pcap_version_string_len;
char *full_pcap_version_string;

if (pcap_lib_version_string == NULL) {
/*
* Generate the version string.
* Get any platform-specific information.
*
* XXX - what about all the local capture modules other
* that the "native interface" one? That could make
* the version string really long.
*/
platform_version_string = pcap_platform_lib_version();
if (platform_version_string == NULL) {
/*
* No platform-specific information.
*/
pcap_lib_version_string = pcap_version_string;
} else {
/*
* Add on the platform-specific information.
*/
full_pcap_version_string_len =
strlen(pcap_version_string) + 2 + strlen(platform_version_string) + 1 + 1;
full_pcap_version_string =
malloc(full_pcap_version_string_len);
if (full_pcap_version_string == NULL)
return (NULL);
pcap_snprintf(full_pcap_version_string,
full_pcap_version_string_len,
"%s (%s)", pcap_version_string,
platform_version_string);
pcap_lib_version_string = full_pcap_version_string;
}
}
return (pcap_lib_version_string);
}
#endif

Expand Down
3 changes: 3 additions & 0 deletions pcap_version.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,8 @@
* being the one from the version of the library with which the program
* was linked, or even weirder things, such as the string being the one
* from the library but being truncated).
*
* In addition, we may add additional information to this string, so
* pcap_lib_version() might not return this string alone anyway.
*/
static const char pcap_version_string[] = "libpcap version %%LIBPCAP_VERSION%%";

0 comments on commit a8578d4

Please # to comment.