From: J. Alexander Treuman Date: Sun, 7 Jun 2009 19:39:38 +0000 (-0400) Subject: preliminary unix socket support X-Git-Tag: v0.3.0~35 X-Git-Url: https://git.kaliko.me/?a=commitdiff_plain;h=8ec145e72766913295c842c0622952c0e50a73a7;p=python-musicpd.git preliminary unix socket support If the host passed to connect() starts with a "/", then a connection attempt is made to the unix socket at the specified path. The port argument is currently still required, but will be ignored. Attempting to connect to a unix socket on Windows will raise an AttributeError (because socket.AF_UNIX isn't defined), however this will later be changed. --- diff --git a/mpd.py b/mpd.py index fdba8ba..e2ef2e8 100644 --- a/mpd.py +++ b/mpd.py @@ -298,29 +298,41 @@ class MPDClient(object): self._rfile = _NotConnected() self._wfile = _NotConnected() - def connect(self, host, port): - if self._sock: - raise ConnectionError("Already connected") - msg = "getaddrinfo returns an empty list" + def _unix_connect(self, path): + sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + sock.connect(path) + return sock + + def _tcp_connect(self, host, port): try: flags = socket.AI_ADDRCONFIG except AttributeError: flags = 0 + msg = "getaddrinfo returns an empty list" for res in socket.getaddrinfo(host, port, socket.AF_UNSPEC, socket.SOCK_STREAM, socket.IPPROTO_TCP, flags): af, socktype, proto, canonname, sa = res try: - self._sock = socket.socket(af, socktype, proto) - self._sock.connect(sa) + sock = socket.socket(af, socktype, proto) + sock.connect(sa) except socket.error, msg: - if self._sock: - self._sock.close() - self._sock = None + if sock: + sock.close() + sock = None continue break - if not self._sock: + if not sock: raise socket.error(msg) + return sock + + def connect(self, host, port): + if self._sock: + raise ConnectionError("Already connected") + if host.startswith("/"): + self._sock = self._unix_connect(host) + else: + self._sock = self._tcp_connect(host, port) self._rfile = self._sock.makefile("rb") self._wfile = self._sock.makefile("wb") try: