* 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-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))
2005-08-12 Daiki Ueno <ueno@unixuser.org>
+ * 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..
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
--- /dev/null
+# aproxy.rb --- async proxy between an IRC server and a client
+# Copyright (C) 1998-2005 Daiki Ueno
+
+# Author: Daiki Ueno <ueno@unixuser.org>
+# 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
-;;; 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 <ueno@unixuser.org>
;;; 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))
(not (looking-at (format "NOTICE CONNECTED %d"
(process-id process))))))
(accept-process-output process))))
+ (process-kill-without-query process)
process))
(defun riece-async-insinuate ()