def serve_file(port, filename):
    """
    Run server on port to serve file f
    Raise exception if fails
    """
    signal.signal(signal.SIGCHLD, sigchld_signal)
    print("Server ran...")
    server_socket = None
    global childs
    try:
        server_socket = server.create_local_server(port)
        #fork udp server
        try:
            pid = os.fork()
        except:
            print("fork failed")
            return 1
        if pid == 0:
            f = open(filename, "rb")
            try:
                server_udp.serve_file(port, f)
            finally:
                f.close()
                os._exit(0)
        else:
            print("Created udp fork [%s]" % pid)
            childs.append(pid)
        while(True):
            try:
                (conn, addr_info) = server_socket.accept()
            except socket.error as e:
                if e.errno == errno.EINTR:
                    continue
            try:
                pid = os.fork()
            except OSError as e:
                print("fork failed")
                return 1
            if pid == 0:
                #its child
                f = open(filename, "rb")
                server_socket.close()
                try:
                    handle_server_request(conn, addr_info, f)
                finally:
                    f.close()
                    os._exit(0)
            else:
                print("Created fork [%s]" % pid)
                childs.append(pid)
                conn.close()
    except socket.error, e:
        print("Socket error: %s" % (e))
Beispiel #2
0
def server_command(args):
    if not os.path.isfile(args.r):
        print("File %s doesn't exists" % args.r)
        sys.exit(1)
    try:
        if args.udp:
            try:
                f = open(args.r, "rb")
            except IOError, e:
                # exit
                print("Can't open file")
                sys.exit(1)
            finally:
                f.close()
            server_udp.serve_file(args.port, f)