X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Frubyserv.rb;h=7c894fca23f9fa7f2fb6c64beba8c12d745c9a1b;hb=31af90ee9dadd320e1820f0524de9dc3460f4ea4;hp=d3a82fff09ed74ba62ce20d5e4b64d90dcf74c1d;hpb=3354b4d91c95d7b050c5e73e691ce7324406ca41;p=riece diff --git a/lisp/rubyserv.rb b/lisp/rubyserv.rb index d3a82ff..7c894fc 100644 --- a/lisp/rubyserv.rb +++ b/lisp/rubyserv.rb @@ -1,5 +1,7 @@ -# A simple IPC server for executing arbitrary Ruby program. +# A simple IPC server executing arbitrary Ruby program. + # The protocol is based on Assuan protocol of GnuPG. +# http://www.gnupg.org/(en)/related_software/libassuan/index.html require 'thread' require 'stringio' @@ -13,7 +15,7 @@ class RubyServ def dispatch(line) case line.chomp when /\AD / - return @buf << unescape($') + @buf << unescape($') when /\A(\S+)\s*/ c = $1 r = $' @@ -58,12 +60,11 @@ class RubyServ def dispatch_eval(c, r) r = deq_data if r.empty? - p r open('|-') do |f| if f d = f.read Process.wait - send_data(d) + send_data(d) if d if $?.success? puts("OK\r\n") else @@ -85,13 +86,11 @@ class RubyServ end def send_data(d) + d = escape(d) begin - r = [d.length, 998].min # 998 = 1000 - CRLF - (0 ... r).each do |i| - r -= 2 if d[i] =~ /[%\r\n]/ - end - puts("D #{escape(d[0 ... r])}\r\n") - d = d[r .. -1] + len = [d.length, 998].min # 998 = 1000 - "D " + puts("D #{d[0 ... len]}\r\n") + d = d[len .. -1] end until d.empty? end