Skip to content

Instantly share code, notes, and snippets.

@aldanor
Last active March 20, 2017 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aldanor/ace2fba5b38a11ef815a730eeb9dde4e to your computer and use it in GitHub Desktop.
Save aldanor/ace2fba5b38a11ef815a730eeb9dde4e to your computer and use it in GitHub Desktop.
libpcap versions
import collections
import fnmatch
import git
import os
import pprint
import pycparser
import subprocess
import tempfile
repo = git.Repo()
[master] = [branch for branch in repo.branches if branch.name == 'master']
tags = [tag for tag in repo.tags if fnmatch.fnmatch(tag.name, 'libpcap-?.?.?')
and tag.name >= 'libpcap-0.8.1']
# collect PCAP_API exports for all post-0.8 versions
api = collections.OrderedDict()
with tempfile.TemporaryDirectory() as tempdir:
git.Repo.clone_from('https://github.com/eliben/pycparser.git',
tempdir + '/pycparser')
fake_libc_include = tempdir + '/pycparser/utils/fake_libc_include'
output_file = tempdir + '/pcap.h'
for tag in tags:
repo.head.reference = tag
repo.head.reset(index=True, working_tree=True)
input_file = 'pcap/pcap.h' if os.path.isfile('pcap/pcap.h') else 'pcap.h'
subprocess.check_call(['gcc', '-E', input_file, '-o', output_file,
'-I', fake_libc_include, '-I', '.'])
header = pycparser.parse_file(output_file)
api[tag.name] = sorted(set(item.name for _, item in header.children()
if isinstance(item.type, pycparser.c_ast.FuncDecl)
and item.name.startswith('pcap_')))
# ensure that all versions are backwards-compatible
for v1, v2 in zip(api, list(api)[1:]):
assert set(api[v1]).issubset(api[v2])
# get API diffs between the versions
initial = api[list(api)[0]]
diffs = {v2: set(api[v2]).difference(api[v1])
for v1, v2 in zip(api, list(api)[1:])
if api[v2] != api[v1]}
pprint.pprint(initial)
pprint.pprint(diffs)
@aldanor
Copy link
Author

aldanor commented Mar 20, 2017

['pcap_breakloop',
 'pcap_close',
 'pcap_compile',
 'pcap_compile_nopcap',
 'pcap_datalink',
 'pcap_datalink_name_to_val',
 'pcap_datalink_val_to_description',
 'pcap_datalink_val_to_name',
 'pcap_dispatch',
 'pcap_dump',
 'pcap_dump_close',
 'pcap_dump_file',
 'pcap_dump_flush',
 'pcap_dump_open',
 'pcap_file',
 'pcap_fileno',
 'pcap_findalldevs',
 'pcap_freealldevs',
 'pcap_freecode',
 'pcap_get_selectable_fd',
 'pcap_geterr',
 'pcap_getnonblock',
 'pcap_is_swapped',
 'pcap_lib_version',
 'pcap_list_datalinks',
 'pcap_lookupdev',
 'pcap_lookupnet',
 'pcap_loop',
 'pcap_major_version',
 'pcap_minor_version',
 'pcap_next',
 'pcap_next_ex',
 'pcap_open_dead',
 'pcap_open_live',
 'pcap_open_offline',
 'pcap_perror',
 'pcap_set_datalink',
 'pcap_setfilter',
 'pcap_setnonblock',
 'pcap_snapshot',
 'pcap_stats',
 'pcap_strerror']
{'libpcap-0.9.1': {'pcap_dump_fopen',
                   'pcap_dump_ftell',
                   'pcap_fopen_offline',
                   'pcap_inject',
                   'pcap_sendpacket',
                   'pcap_setdirection'},
 'libpcap-1.0.0': {'pcap_activate',
                   'pcap_can_set_rfmon',
                   'pcap_create',
                   'pcap_datalink_ext',
                   'pcap_free_datalinks',
                   'pcap_offline_filter',
                   'pcap_set_buffer_size',
                   'pcap_set_promisc',
                   'pcap_set_rfmon',
                   'pcap_set_snaplen',
                   'pcap_set_timeout',
                   'pcap_statustostr'},
 'libpcap-1.2.1': {'pcap_free_tstamp_types',
                   'pcap_list_tstamp_types',
                   'pcap_set_tstamp_type',
                   'pcap_tstamp_type_name_to_val',
                   'pcap_tstamp_type_val_to_description',
                   'pcap_tstamp_type_val_to_name'},
 'libpcap-1.5.0': {'pcap_fopen_offline_with_tstamp_precision',
                   'pcap_get_tstamp_precision',
                   'pcap_open_dead_with_tstamp_precision',
                   'pcap_open_offline_with_tstamp_precision',
                   'pcap_set_immediate_mode',
                   'pcap_set_tstamp_precision'},
 'libpcap-1.7.2': {'pcap_dump_open_append'}}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment