X-Git-Url: http://git.tremily.us/?p=pyassuan.git;a=blobdiff_plain;f=pyassuan%2Fclient.py;h=2555ebc80f446daf8410de4d2e4a5af2cb23207f;hp=2feca475ce9121a7ac0f219542ad93b1e2e643c1;hb=fad28835c3070fa02944c715a1030f3f8d1a33a8;hpb=4c6abd251db99612d8e6591ec514f4a6070e67d6 diff --git a/pyassuan/client.py b/pyassuan/client.py index 2feca47..2555ebc 100644 --- a/pyassuan/client.py +++ b/pyassuan/client.py @@ -15,6 +15,7 @@ # pyassuan. If not, see . import logging as _logging +import socket as _socket import sys as _sys from . import LOG as _LOG @@ -23,7 +24,7 @@ from . import error as _error class AssuanClient (object): - """A single-threaded Assuan client based on the `devolpment suggestions`_ + """A single-threaded Assuan client based on the `development suggestions`_ .. _development suggestions: http://www.gnupg.org/documentation/manuals/assuan/Client-code.html @@ -35,21 +36,37 @@ class AssuanClient (object): logger = _logging.getLogger('{}.{}'.format(logger.name, self.name)) self.logger = logger self.close_on_disconnect = close_on_disconnect - self.input = self.output = None + self.input = self.output = self.socket = None - def connect(self): - if not self.input: - self.logger.info('read from stdin') - self.input = _sys.stdin.buffer - if not self.output: - self.logger.info('write to stdout') - self.output = _sys.stdout.buffer + def connect(self, socket_path=None): + if socket_path: + self.logger.info( + 'connect to Unix socket at {}'.format(socket_path)) + self.socket = _socket.socket(_socket.AF_UNIX, _socket.SOCK_STREAM) + self.socket.connect(socket_path) + self.input = self.socket.makefile('rb') + self.output = self.socket.makefile('wb') + else: + if not self.input: + self.logger.info('read from stdin') + self.input = _sys.stdin.buffer + if not self.output: + self.logger.info('write to stdout') + self.output = _sys.stdout.buffer def disconnect(self): if self.close_on_disconnect: self.logger.info('disconnecting') - self.input = None - self.output = None + if self.input is not None: + self.input.close() + self.input = None + if self.output is not None: + self.output.close() + self.output = None + if self.socket is not None: + self.socket.shutdown(_socket.SHUT_RDWR) + self.socket.close() + self.socket = None def raise_error(self, error): self.logger.error(str(error))