-# A simple IPC server executing Ruby programs.
+# server.rb --- A simple IPC server executing Ruby programs.
+# Copyright (C) 1998-2005 Daiki Ueno
+
+# Author: Daiki Ueno <ueno@unixuser.org>
+# Created: 1998-09-28
+# Keywords: IRC, riece, Ruby
+
+# This file is part of Riece.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GNU Emacs; see the file COPYING. If not, write to the
+# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
require 'thread'
require 'stringio'
send_line("S name #{name}\r\n")
send_line("OK\r\n")
Thread.current[:rubyserv_name] = name
- out, log = @out, @log
- env = Module.new
- env.module_eval do
- @out, @log = out, log
-
- def send_line(line)
- @out.puts(line)
- @log.puts(line) if @log
- end
- module_function :send_line
-
- def output(s)
- send_line("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
- end
- module_function :output
- end
begin
Thread.current[:rubyserv_error] = false
- Thread.current[:rubyserv_response] = eval(r, env.module_eval {binding()})
+ Thread.current[:rubyserv_response] = eval(r, exec_env.empty_binding)
rescue Exception => e
Thread.current[:rubyserv_error] = true
- Thread.current[:rubyserv_response] = e.to_s.sub(/\A.*?\n/, '')
+ Thread.current[:rubyserv_response] =
+ e.to_s.sub(/\A.*?\n#{Regexp.quote(__FILE__)}:\d+: /o, '')
end
send_line("# exit #{name}\r\n")
end
@out.puts(line)
@log.puts(line) if @log
end
+
+ def exec_env
+ env = Object.new
+ def env.empty_binding
+ binding
+ end
+ out, log = @out, @log
+ env.instance_eval {@out, @log = out, log}
+ def env.send_line(line)
+ @out.puts(line)
+ @log.puts(line) if @log
+ end
+ def env.output(s)
+ send_line("# output #{Thread.current[:rubyserv_name]} #{s}\r\n")
+ end
+ env
+ end
end
if $0 == __FILE__
opts.on('-e', '--err ERRFILE', 'Send stderr to ERRFILE.') do |errfile|
opt_errfile = errfile
end
- opts.on('-e', '--log LOGFILE', 'Send stdlog to LOGFILE.') do |logfile|
+ opts.on('-l', '--log LOGFILE', 'Send log to LOGFILE.') do |logfile|
opt_logfile = logfile
end
opts.on_tail('--help', '-h', 'Show this message.') do