1 # A simple IPC server executing Ruby programs.
9 @out.puts("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
11 module_function :output
17 $stdout = StringIO.new
18 $stderr = StringIO.new
37 d = "dispatch_#{c.downcase}"
38 if respond_to?(d, true)
43 @out.puts("ERR 103 Unknown command\r\n")
48 def dispatch_cancel(c, r)
49 @out.puts("ERR 100 Not implemented\r\n")
52 def dispatch_bye(c, r)
53 @out.puts("ERR 100 Not implemented\r\n")
56 def dispatch_auth(c, r)
57 @out.puts("ERR 100 Not implemented\r\n")
60 def dispatch_reset(c, r)
61 @out.puts("ERR 100 Not implemented\r\n")
64 def dispatch_end(c, r)
68 def dispatch_help(c, r)
69 @out.puts("ERR 100 Not implemented\r\n")
72 def dispatch_quit(c, r)
73 @out.puts("ERR 100 Not implemented\r\n")
76 def dispatch_eval(c, r)
77 r = deq_data if r.empty?
80 while @thr.include?(name = @cnt.to_s)
83 @thr[name] = Thread.current
85 @out.puts("S name #{name}\r\n")
87 Thread.current[:rubyserv_name] = name
89 Thread.current[:rubyserv_error] = false
90 Thread.current[:rubyserv_response] = eval(r, B.module_eval('binding()'))
92 Thread.current[:rubyserv_error] = true
93 Thread.current[:rubyserv_response] = e.to_s.sub(/\A.*?\n/, '')
95 @out.puts("# exit #{name}\r\n")
98 def dispatch_poll(c, r)
101 @out.puts("ERR 105 Parameter error: no such name \"#{r}\"\r\n")
103 @out.puts("S running #{r}\r\n")
106 if thr[:rubyserv_error]
107 @out.puts("S exited #{r}\r\n")
109 @out.puts("S finished #{r}\r\n")
111 if d = thr[:rubyserv_response]
118 def dispatch_exit(c, r)
121 @out.puts("ERR 105 Parameter error: no such name \"#{r}\"\r\n")
124 thr.kill if thr.alive?
130 s.gsub(/[%\r\n]/) {|m| '%%%02X' % m[0]}
134 s.gsub(/%([0-9A-Z][0-9A-Z])/) {[$1].pack('H*')}
140 len = [d.length, 998].min # 998 = 1000 - "D "
141 @out.puts("D #{d[0 ... len]}\r\n")