diff -r 02de1dbd4f6e -r 3239e2fdd2e2 mercurial/posix.py --- a/mercurial/posix.py Sat May 21 16:42:59 2016 +0900 +++ b/mercurial/posix.py Sat May 21 16:52:04 2016 +0900 @@ -598,3 +598,18 @@ return ''.join(chunks) finally: fcntl.fcntl(pipe, fcntl.F_SETFL, oldflags) + +def bindunixsocket(sock, path): + """Bind the UNIX domain socket to the specified path""" + # use relative path instead of full path at bind() if possible, since + # AF_UNIX path has very small length limit (107 chars) on common + # platforms (see sys/un.h) + dirname, basename = os.path.split(path) + bakwdfd = None + if dirname: + bakwdfd = os.open('.', os.O_DIRECTORY) + os.chdir(dirname) + sock.bind(basename) + if bakwdfd: + os.fchdir(bakwdfd) + os.close(bakwdfd)