#!/usr/bin/env ruby require 'socket' require 'timeout' # daemonize() daemonizes this process. Cool =) def daemonize() if(childPID = fork) # Parent code puts("PID #{childPID}") Kernel::exit(0) # We dont want this parent process any more. Too bad. end # Child code. And child wants to be free from parent! Process.setsid() end class ClipServer def initialize @socket = TCPServer.new('0.0.0.0', 13721) @clipboards = {} end def process() # Main loop while(true) # Session handler begin session = @socket.accept() timeout(300) { command, buffer = session.gets.split if(command.downcase == 'put') data = '' foo = '' while(foo = session.read(1)) data << foo end @clipboards[buffer] = data else session.print(@clipboards[buffer] || '') # Return contents or empty string session.close # Abort connection end } rescue Timeout::Error STDERR.puts("Timeout error") session.close rescue Exception => e STDERR.puts("#{e.message}\n#{e.backtrace}") end # Session handler end # Main loop end end daemonize() ClipServer.new().process