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 errno
import logging
import ctypes as c
from collections import deque, defaultdict, namedtuple
......@@ -40,12 +41,22 @@ class NonConsecutiveSeqId(Error):
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'])
def __init__(self, fobj, header_lookup=None, with_data=True):
self.file = fobj
self.header_lookup = header_lookup
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):
return self
......@@ -61,6 +72,7 @@ class BasicStream(object):
raise PacketTooShort(
'expected to read {:d} bytes, got {:d}'
.format(size, len(buf)))
self._offset += size
return buf
def read_primary_header(self):
......@@ -77,7 +89,7 @@ class BasicStream(object):
return H2Impl.from_buffer_copy(buf), h2size
def next(self):
offset = self.file.tell()
offset = self._offset
h1, h1size = self.read_primary_header()
h2, h2size = self.read_secondary_header(h1)
# 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