1 # A simple IPC server executing Ruby programs.
20 d = "dispatch_#{c.downcase}"
21 if respond_to?(d, true)
26 puts("ERR 103 Unknown command\r\n")
31 def dispatch_cancel(c, r)
32 puts("ERR 100 Not implemented\r\n")
35 def dispatch_bye(c, r)
36 puts("ERR 100 Not implemented\r\n")
39 def dispatch_auth(c, r)
40 puts("ERR 100 Not implemented\r\n")
43 def dispatch_reset(c, r)
44 puts("ERR 100 Not implemented\r\n")
47 def dispatch_end(c, r)
51 def dispatch_help(c, r)
52 puts("ERR 100 Not implemented\r\n")
55 def dispatch_quit(c, r)
56 puts("ERR 100 Not implemented\r\n")
59 def dispatch_eval(c, r)
60 name, code = r.split(/\s+/, 2)
61 if @thr.include?(name) && @thr[name].alive?
62 puts("ERR 105 Parameter error: \"#{name}\" is already in use\r\n")
65 code = deq_data unless code
67 @thr[name] = Thread.current
68 Thread.current[:rubyserv_name] = name
70 Thread.current[:rubyserv_error] = false
71 Thread.current[:rubyserv_response] = eval(code)
73 Thread.current[:rubyserv_error] = true
74 Thread.current[:rubyserv_response] = e
76 puts("# exited #{name}\r\n")
79 def dispatch_poll(c, r)
82 puts("ERR 105 Parameter error: no such name \"#{r}\"\r\n")
88 if thr[:rubyserv_error]
91 puts("S finished\r\n")
93 if d = thr[:rubyserv_response]
101 s.gsub(/[%\r\n]/) {|m| '%%%02X' % m[0]}
105 s.gsub(/%([0-9A-Z][0-9A-Z])/, ['\1'].pack('H*'))
109 puts("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
115 len = [d.length, 998].min # 998 = 1000 - "D "
116 puts("D #{d[0 ... len]}\r\n")
122 @que.enq(@buf.string)