From 17d504908b42109782fa43090fe70cf8cdb39f93 Mon Sep 17 00:00:00 2001 From: ueno Date: Fri, 12 Aug 2005 04:06:31 +0000 Subject: [PATCH] * Makefile.am (EXTRA_DIST): Added aproxy.rb. * COMPILE (riece-scripts): Added "aproxy.rb". * riece-async.el (riece-async-buffer-size): Renamed from riece-async-max-buffer-size. (riece-async-backup-file): New user option. (riece-async-server-program): New variable. (riece-async-server-program-arguments): New variable. (riece-async-open-network-stream): Use aproxy.rb. * aproxy.rb: New file. --- lisp/COMPILE | 3 +- lisp/ChangeLog | 13 +++++++ lisp/Makefile.am | 2 +- lisp/aproxy.rb | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++ lisp/riece-async.el | 91 ++++++++++--------------------------------- 5 files changed, 144 insertions(+), 72 deletions(-) create mode 100644 lisp/aproxy.rb diff --git a/lisp/COMPILE b/lisp/COMPILE index ba93344..b4f4561 100644 --- a/lisp/COMPILE +++ b/lisp/COMPILE @@ -90,7 +90,8 @@ "riece-submit-bug-report.xpm")) (defvar riece-scripts - '("server.rb")) + '("server.rb" + "aproxy.rb")) (defun riece-compile-modules (modules) (let ((load-path (cons nil load-path)) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 990e7c3..8f8d5e7 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,18 @@ 2005-08-12 Daiki Ueno + * Makefile.am (EXTRA_DIST): Added aproxy.rb. + + * COMPILE (riece-scripts): Added "aproxy.rb". + + * riece-async.el (riece-async-buffer-size): Renamed from + riece-async-max-buffer-size. + (riece-async-backup-file): New user option. + (riece-async-server-program): New variable. + (riece-async-server-program-arguments): New variable. + (riece-async-open-network-stream): Use aproxy.rb. + + * aproxy.rb: New file. + * riece-ruby.el (riece-ruby-out-file): New user option. (riece-ruby-err-file): New user option. (riece-ruby-log-file): New user option.. diff --git a/lisp/Makefile.am b/lisp/Makefile.am index c185dda..e15d83b 100644 --- a/lisp/Makefile.am +++ b/lisp/Makefile.am @@ -19,7 +19,7 @@ EXTRA_DIST = COMPILE ChangeLog ChangeLog.Liece \ riece-keepalive.el riece-eval-ruby.el url-riece.el \ riece-command-previous-channel.xpm riece-command-next-channel.xpm \ riece-submit-bug-report.xpm \ - server.rb + server.rb aproxy.rb CLEANFILES = auto-autoloads.el custom-load.el *.elc FLAGS ?= -batch -q -no-site-file diff --git a/lisp/aproxy.rb b/lisp/aproxy.rb new file mode 100644 index 0000000..df88f94 --- /dev/null +++ b/lisp/aproxy.rb @@ -0,0 +1,107 @@ +# aproxy.rb --- async proxy between an IRC server and a client +# Copyright (C) 1998-2005 Daiki Ueno + +# Author: Daiki Ueno +# Created: 1998-09-28 +# Keywords: IRC, riece + +# 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., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +require 'io/nonblock' +require 'socket' + +class AProxy + def initialize(host, port, size, back) + @host = host + @port = port + @size = size + @back = File.new(back, 'a') if back + end + + def start + $stdout.nonblock = true + trap('STOP', 'IGNORE') + trap('TSTP', 'IGNORE') + socket = TCPSocket.new(@host, @port) + @out.write("NOTICE CONNECTED #{$$}\r\n") + wfds_in = [] + buf = '' + loop do + rfds, wfds, = select([socket, $stdin], wfds_in) + unless wfds.empty? + if buf.length > @size + s = buf.slice!(0 ... @size) + @back.write(s) if @back + end + begin + until buf.empty? + len = $stdout.syswrite(buf) + buf.slice!(0 .. len) + end + wfds_in.clear + rescue Errno::EAGAIN + end + end + if rfds.include?(socket) + line = socket.gets("\r\n") + break unless line + if line =~ /\A(?::\S+\s+)?PING\s+(.*)\r\n/i + socket.write("PONG #{$1}\r\n") + else + wfds_in = [$stdout] + buf << line + end + end + if rfds.include?($stdin) + line = $stdin.gets("\r\n") + break unless line + socket.write(line) + end + end + socket.close + end +end + +if $0 == __FILE__ + require 'optparse' + + opt_size, opt_back = nil, nil + opts = OptionParser.new do |opts| + opts.banner = <<"End" +Usage: #{$0} [OPTIONS] host port +End + opts.on('-s', '--size SIZE', 'Size of buffer.') do |size| + opt_size = size.to_i + end + opts.on('-b', '--back BACK', 'Send outdated messages to BACK.') do |back| + opt_back = back + end + opts.on_tail('--help', '-h', 'Show this message.') do + $stdout.print(opts.to_s) + exit(0) + end + end + begin + opts.parse!(ARGV) + rescue OptionParser::ParseError + $stderr.print(opts.to_s) + exit(1) + end + + AProxy.new(ARGV.shift, ARGV.shift, opt_size, opt_back).start +end diff --git a/lisp/riece-async.el b/lisp/riece-async.el index 05827cd..4635643 100644 --- a/lisp/riece-async.el +++ b/lisp/riece-async.el @@ -1,4 +1,4 @@ -;;; riece-async.el --- connect to IRC server via asynchronous proxy +;;; riece-async.el --- connect to IRC server via async proxy ;; Copyright (C) 1998-2003 Daiki Ueno ;; Author: Daiki Ueno @@ -38,91 +38,41 @@ ;;; Code: (require 'riece-options) -(require 'riece-ruby) ;riece-ruby-command, - ;riece-ruby-substitute-variables (defgroup riece-async nil "Connect to IRC server via asynchronous proxy" :prefix "riece-" :group 'riece) -(defcustom riece-async-server-program - '("\ -orequire 'io/nonblock' -socket = TCPSocket.new(" host ", " service ") -$stdout.write(\"NOTICE CONNECTED #{$$}\\r\\n\") -$stdout.flush -$stdout.nonblock = true -trap('STOP', 'IGNORE') -trap('TSTP', 'IGNORE') -wfds_in = [] -buf = '' -loop do - rfds, wfds, = select([socket, $stdin], wfds_in) - unless wfds.empty? - until buf.length <= " max-buffer-size " - i = buf.index(\"\\r\\n\") - break unless i - buf.slice!(0 .. i + 1) - end - begin - until buf.empty? - len = $stdout.syswrite(buf) - buf.slice!(0 .. len) - end - wfds_in = [] - rescue Errno::EAGAIN - end - end - if rfds.include?(socket) - line = socket.gets(\"\\r\\n\") - break unless line - if line =~ /^(?::[^ ]+ +)?PING +(.+)\\r\\n/i - socket.write(\"PONG #{$1}\\r\\n\") - socket.flush - else - wfds_in = [$stdout] - buf << line - end - end - if rfds.include?($stdin) - line = $stdin.gets(\"\\r\\n\") - break unless line - socket.write(line) - socket.flush - end -end -socket.close -") - "Ruby program of asynchronous proxy." - :type 'list - :group 'riece-async) - -(defcustom riece-async-max-buffer-size 65535 +(defcustom riece-async-buffer-size 65535 "Maximum size of the write buffer." :type 'integer :group 'riece-async) +(defcustom riece-async-backup-file (expand-file-name "riece-async.bak" + riece-directory) + "A file which contains outdated messages." + :type 'string + :group 'riece-async) + +(defvar riece-async-server-program "aproxy.rb" + "The server program file. If the filename is not absolute, it is +assumed that the file is in the same directory of this file.") + +(defvar riece-async-server-program-arguments + (list "-s" riece-async-buffer-size + "-b" riece-async-backup-file) + "Command line arguments passed to `riece-async-server-program'.") + (defconst riece-async-description "Keep IRC connection with external process") ;;;###autoload (defun riece-async-open-network-stream (name buffer host service) (let* ((process-connection-type nil) - (process (start-process name buffer riece-ruby-command "-rsocket"))) - (process-kill-without-query process) - (process-send-string process - (riece-ruby-substitute-variables - (list (cons 'host - (concat "'" host "'")) - (cons 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))) - (cons 'max-buffer-size - (number-to-string - riece-async-max-buffer-size))))) - (process-send-string process "\0\n") ;input to process is needed + (process (apply #'start-process name buffer riece-ruby-command + riece-async-server-program + riece-async-server-program-arguments))) (if buffer (save-excursion (set-buffer (process-buffer process)) @@ -132,6 +82,7 @@ socket.close (not (looking-at (format "NOTICE CONNECTED %d" (process-id process)))))) (accept-process-output process)))) + (process-kill-without-query process) process)) (defun riece-async-insinuate () -- 1.7.10.4