def make_nailgun_transport()

in nailgun-client/py/ng.py [0:0]


def make_nailgun_transport(nailgun_server, nailgun_port=None, cwd=None):
    """
    Creates and returns a socket connection to the nailgun server.
    """
    transport = None
    if nailgun_server.startswith("local:"):
        if platform.system() == "Windows":
            pipe_addr = nailgun_server[6:]
            transport = WindowsNamedPipeTransport(pipe_addr)
        else:
            try:
                s = socket.socket(socket.AF_UNIX)
            except socket.error as msg:
                re_raise(
                    NailgunException(
                        "Could not create local socket connection to server: {0}".format(
                            msg
                        ),
                        NailgunException.SOCKET_FAILED,
                    )
                )
            socket_addr = nailgun_server[6:]
            prev_cwd = os.getcwd()
            try:
                if cwd is not None:
                    os.chdir(cwd)
                s.connect(socket_addr)
                transport = UnixTransport(s)
            except socket.error as msg:
                re_raise(
                    NailgunException(
                        "Could not connect to local server at {0}: {1}".format(
                            socket_addr, msg
                        ),
                        NailgunException.CONNECT_FAILED,
                    )
                )
            finally:
                if cwd is not None:
                    os.chdir(prev_cwd)
    else:
        socket_addr = nailgun_server
        socket_family = socket.AF_UNSPEC
        for (af, socktype, proto, _, sa) in socket.getaddrinfo(
            nailgun_server, nailgun_port, socket.AF_UNSPEC, socket.SOCK_STREAM
        ):
            try:
                s = socket.socket(af, socktype, proto)
            except socket.error as msg:
                s = None
                continue
            try:
                s.connect(sa)
                transport = UnixTransport(s)
            except socket.error as msg:
                s.close()
                s = None
                continue
            break
    if transport is None:
        raise NailgunException(
            "Could not connect to server {0}:{1}".format(nailgun_server, nailgun_port),
            NailgunException.CONNECT_FAILED,
        )
    return transport