#!/usr/bin/python3

import asyncio
import os
import socket
import sys


SD_LISTEN_FDS_START = 3

def listen_sockets():
    # Ignore environment variables if they were set for a different process
    if os.getpid() != int(os.environ.get("LISTEN_PID", "0")):
        return []

    nfds = int(os.environ.get("LISTEN_FDS", "0"))
    names = os.environ.get("LISTEN_FDNAMES", "").split(":")

    fds = []
    for i in range(nfds):
        sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0, fileno=SD_LISTEN_FDS_START+i)
        fds.append((names[i], sock))

    return fds


class SocketNameProtocol(asyncio.Protocol):
    def __init__(self, socket_name):
        self.socket_name = socket_name

    def connection_made(self, transport):
        message = "Connected to {}\n".format(self.socket_name)
        transport.write(message.encode("ASCII"))
        transport.close()


def make_factory(socket_name):
    return lambda: SocketNameProtocol(socket_name)


def main():
    loop = asyncio.get_event_loop()
    coros = [loop.create_unix_server(make_factory(name), sock=sock)
             for (name, sock) in listen_sockets()]
    servers = loop.run_until_complete(asyncio.gather(*coros))
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass


if __name__ == "__main__":
    sys.exit(main())
