1 # A simple IPC server executing Ruby programs.
8 puts("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
10 module_function :output
27 d = "dispatch_#{c.downcase}"
28 if respond_to?(d, true)
33 puts("ERR 103 Unknown command\r\n")
38 def dispatch_cancel(c, r)
39 puts("ERR 100 Not implemented\r\n")
42 def dispatch_bye(c, r)
43 puts("ERR 100 Not implemented\r\n")
46 def dispatch_auth(c, r)
47 puts("ERR 100 Not implemented\r\n")
50 def dispatch_reset(c, r)
51 puts("ERR 100 Not implemented\r\n")
54 def dispatch_end(c, r)
58 def dispatch_help(c, r)
59 puts("ERR 100 Not implemented\r\n")
62 def dispatch_quit(c, r)
63 puts("ERR 100 Not implemented\r\n")
66 def dispatch_eval(c, r)
67 r = deq_data if r.empty?
70 while @thr.include?(name = @cnt.to_s)
73 @thr[name] = Thread.current
75 puts("S name #{name}\r\n")
77 Thread.current[:rubyserv_name] = name
79 Thread.current[:rubyserv_error] = false
80 Thread.current[:rubyserv_response] = eval(r, B.module_eval('binding()'))
82 Thread.current[:rubyserv_error] = true
83 Thread.current[:rubyserv_response] = e.to_s.sub(/\A.*?\n/, '')
85 puts("# exit #{name}\r\n")
88 def dispatch_poll(c, r)
91 puts("ERR 105 Parameter error: no such name \"#{r}\"\r\n")
93 puts("S running #{r}\r\n")
96 if thr[:rubyserv_error]
97 puts("S exited #{r}\r\n")
99 puts("S finished #{r}\r\n")
101 if d = thr[:rubyserv_response]
108 def dispatch_exit(c, r)
111 puts("ERR 105 Parameter error: no such name \"#{r}\"\r\n")
114 thr.kill if thr.alive?
120 s.gsub(/[%\r\n]/) {|m| '%%%02X' % m[0]}
124 s.gsub(/%([0-9A-Z][0-9A-Z])/) {[$1].pack('H*')}
130 len = [d.length, 998].min # 998 = 1000 - "D "
131 puts("D #{d[0 ... len]}\r\n")