summaryrefslogtreecommitdiff
path: root/poezio/fifo.py
diff options
context:
space:
mode:
authorEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2016-03-31 18:54:41 +0100
committerEmmanuel Gil Peyrot <linkmauve@linkmauve.fr>2016-06-11 20:49:43 +0100
commit332a5c2553db41de777473a1e1be9cd1522c9496 (patch)
tree3ee06a59f147ccc4009b35cccfbe2461bcd18310 /poezio/fifo.py
parentcf44cf7cdec9fdb35caa372563d57e7045dc29dd (diff)
downloadpoezio-332a5c2553db41de777473a1e1be9cd1522c9496.tar.gz
poezio-332a5c2553db41de777473a1e1be9cd1522c9496.tar.bz2
poezio-332a5c2553db41de777473a1e1be9cd1522c9496.tar.xz
poezio-332a5c2553db41de777473a1e1be9cd1522c9496.zip
Move the src directory to poezio, for better cython compatibility.
Diffstat (limited to 'poezio/fifo.py')
-rw-r--r--poezio/fifo.py71
1 files changed, 71 insertions, 0 deletions
diff --git a/poezio/fifo.py b/poezio/fifo.py
new file mode 100644
index 00000000..863ef228
--- /dev/null
+++ b/poezio/fifo.py
@@ -0,0 +1,71 @@
+"""
+Defines the Fifo class
+
+This fifo allows simple communication between a remote poezio
+and a local computer, with ssh+cat.
+"""
+
+import logging
+log = logging.getLogger(__name__)
+
+import os
+import threading
+
+class OpenTrick(threading.Thread):
+ """
+ A threaded trick to make the open for writing succeed.
+ A fifo cannot be opened for writing if it has not been
+ yet opened by the other hand for reading.
+ So, we just open the fifo for reading and we do not close
+ it afterwards, because if the other reader disconnects,
+ we will receive a SIGPIPE. And we do not want that.
+
+ (we never read anything from it, obviously)
+ """
+ def __init__(self, path):
+ threading.Thread.__init__(self)
+ self.path = path
+ self.fd = None
+
+ def run(self):
+ self.fd = open(self.path, 'r', encoding='utf-8')
+
+
+class Fifo(object):
+ """
+ Just a simple file handler, writing and reading in a fifo.
+ Mode is either 'r' or 'w', just like the mode for the open()
+ function.
+ """
+ def __init__(self, path, mode):
+ self.trick = None
+ if not os.path.exists(path):
+ os.mkfifo(path)
+ if mode == 'w':
+ self.trick = OpenTrick(path)
+ # that thread will wait until we open it for writing
+ self.trick.start()
+ self.fd = open(path, mode, encoding='utf-8')
+
+ def write(self, data):
+ """
+ Try to write on the fifo. If that fails, this means
+ that nothing has that fifo opened, so the writing is useless,
+ so we just return (and display an error telling that, somewhere).
+ """
+ self.fd.write(data)
+ self.fd.flush()
+
+ def readline(self):
+ "Read a line from the fifo"
+ return self.fd.readline()
+
+ def __del__(self):
+ "Close opened fds"
+ try:
+ self.fd.close()
+ if self.trick:
+ self.trick.fd.close()
+ except:
+ log.error('Unable to close descriptors for the fifo',
+ exc_info=True)