Skip to content
Snippets Groups Projects
Commit fc5914f2 authored by Bruce Flynn's avatar Bruce Flynn
Browse files

Support pipes as streams

parent 82883d61
No related branches found
No related tags found
No related merge requests found
import os import os
import errno
import logging import logging
import ctypes as c import ctypes as c
from collections import deque, defaultdict, namedtuple from collections import deque, defaultdict, namedtuple
...@@ -40,12 +41,22 @@ class NonConsecutiveSeqId(Error): ...@@ -40,12 +41,22 @@ class NonConsecutiveSeqId(Error):
class BasicStream(object): class BasicStream(object):
"""
Basic packet stream iterator that reads the primary and secondary headers and
maintains offsets and read sizes.
"""
Tracker = namedtuple('Tracker', ['h1', 'h2', 'size', 'offset', 'data']) Tracker = namedtuple('Tracker', ['h1', 'h2', 'size', 'offset', 'data'])
def __init__(self, fobj, header_lookup=None, with_data=True): def __init__(self, fobj, header_lookup=None, with_data=True):
self.file = fobj self.file = fobj
self.header_lookup = header_lookup self.header_lookup = header_lookup
self.with_data = with_data self.with_data = with_data
try:
self._offset = self.file.tell()
except IOError as err: # handle illegal seek for pipes
if err.errno != errno.ESPIPE:
raise
self._offset = 0
def __iter__(self): def __iter__(self):
return self return self
...@@ -61,6 +72,7 @@ class BasicStream(object): ...@@ -61,6 +72,7 @@ class BasicStream(object):
raise PacketTooShort( raise PacketTooShort(
'expected to read {:d} bytes, got {:d}' 'expected to read {:d} bytes, got {:d}'
.format(size, len(buf))) .format(size, len(buf)))
self._offset += size
return buf return buf
def read_primary_header(self): def read_primary_header(self):
...@@ -77,7 +89,7 @@ class BasicStream(object): ...@@ -77,7 +89,7 @@ class BasicStream(object):
return H2Impl.from_buffer_copy(buf), h2size return H2Impl.from_buffer_copy(buf), h2size
def next(self): def next(self):
offset = self.file.tell() offset = self._offset
h1, h1size = self.read_primary_header() h1, h1size = self.read_primary_header()
h2, h2size = self.read_secondary_header(h1) h2, h2size = self.read_secondary_header(h1)
# data length includes h2size # data length includes h2size
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment