From fc5914f2657f8d55c8ac33ff727ad526f7b24951 Mon Sep 17 00:00:00 2001
From: Bruce Flynn <brucef@ssec.wisc.edu>
Date: Tue, 20 Oct 2015 17:38:04 +0000
Subject: [PATCH] Support pipes as streams

---
 edosl0util/stream.py | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/edosl0util/stream.py b/edosl0util/stream.py
index 2efd489..746d821 100644
--- a/edosl0util/stream.py
+++ b/edosl0util/stream.py
@@ -1,4 +1,5 @@
 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
-- 
GitLab