Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Last active November 17, 2018 04:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoshCheek/c34d54e87fc771d2972e50c9900cfaeb to your computer and use it in GitHub Desktop.
Save JoshCheek/c34d54e87fc771d2972e50c9900cfaeb to your computer and use it in GitHub Desktop.
require 'socket'
FORWARDED_SIGNALS = %w(INT QUIT USR1 USR2 INFO WINCH) & Signal.list.keys
receiver = UNIXSocket.new('whatevz.sock')
pid = receiver.gets.to_i
receiver.send_io $stdin
receiver.send_io $stdout
$stdin.close
$stdout.close
FORWARDED_SIGNALS.each do |signal|
trap(signal) { Process.kill signal, pid }
end
# fg/bg applies to both the server and ourselves
orig_tstp_handler = orig_cont_handler = nil
tstp_handler = lambda do |*|
Process.kill 'TSTP', pid
trap 'TSTP', orig_tstp_handler
Process.kill 'TSTP', Process.pid
end
cont_handler = lambda do |*|
trap 'CONT', orig_cont_handler
Process.kill 'CONT', Process.pid
trap 'CONT', cont_handler
Process.kill 'CONT', pid
trap 'TSTP', tstp_handler
end
orig_tstp_handler = trap 'TSTP', tstp_handler
orig_cont_handler = trap 'CONT', cont_handler
loop do
break if receiver.closed?
break if IO.select [receiver], [], [], 1
end
require 'socket'
# This sockets listens for local connections.
name = 'whatevz.sock'
File.delete name if File.exist? name
at_exit { File.delete name if File.exist? name }
listener = UNIXServer.new name
at_exit { listener.close unless listener.closed? }
client = listener.accept
at_exit { client.close unless client.closed? }
at_exit { client.puts "fin" unless client.closed? }
client.puts Process.pid
def log(type, message)
puts "#{type}: #{message.inspect}"
end
read = client.recv_io
log :reader, read
write = client.recv_io
log :writer, write
loop do
message = read.gets
log :message, message
write.puts message
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment