X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Friece-async.el;h=930a2c36382870b2c42506c31bc6e7dc8f794789;hb=24f0978f28139916a165f0ed2e69d554c1572b0a;hp=a1bab544fc1db3753f7088596e3b73ac14819c64;hpb=ee8a720e4032fc345cd0c09b402a90055fd7ad61;p=riece diff --git a/lisp/riece-async.el b/lisp/riece-async.el index a1bab54..930a2c3 100644 --- a/lisp/riece-async.el +++ b/lisp/riece-async.el @@ -37,6 +37,8 @@ ;;; Code: +(require 'riece-options) + (defgroup riece-async nil "Connect to IRC server via asynchronous proxy" :prefix "riece-" @@ -49,36 +51,64 @@ (defcustom riece-async-server-program '("\ +require 'io/nonblock' socket = TCPSocket.new(" host ", " service ") -$stdout.write(\"NOTICE CONNECTED #{$$}\r\n\") +$stdout.write(\"NOTICE CONNECTED #{$$}\\r\\n\") $stdout.flush +$stdout.nonblock = true +trap('STOP', 'IGNORE') +trap('TSTP', 'IGNORE') +wfds_in = [] +buf = '' loop do - rfds, = select([socket, $stdin]) - if rfds.delete(socket) - line = socket.gets(\"\r\n\") + 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\") + if line =~ /^(?::[^ ]+ +)?PING +(.+)\\r\\n/i + socket.write(\"PONG #{$1}\\r\\n\") socket.flush else - $stdout.write(line) - $stdout.flush + wfds_in = [$stdout] + buf << line end end - if rfds.delete($stdin) - line = $stdin.gets(\"\r\n\") + if rfds.include?($stdin) + line = $stdin.gets(\"\\r\\n\") break unless line socket.write(line) socket.flush end end socket.close -exit ") - "Ruby program of asynchronous proxy" + "Ruby program of asynchronous proxy." :type 'list :group 'riece-async) +(defcustom riece-async-max-buffer-size 65535 + "Maximum size of the write buffer." + :type 'integer + :group 'riece-async) + +(defconst riece-async-description + "Keep IRC connection with external process") + (defun riece-async-substitute-variables (program variable value) (setq program (copy-sequence program)) (let ((pointer program)) @@ -97,13 +127,17 @@ exit (apply #'concat (riece-async-substitute-variables (riece-async-substitute-variables - riece-async-server-program - 'host - (concat "'" host "'")) - 'service - (if (numberp service) - (number-to-string service) - (concat "'" service "'"))))) + (riece-async-substitute-variables + riece-async-server-program + 'host + (concat "'" host "'")) + 'service + (if (numberp service) + (number-to-string service) + (concat "'" service "'"))) + 'max-buffer-size + (number-to-string + riece-async-max-buffer-size)))) (process-send-string process "\0\n") ;input to process is needed (if buffer (save-excursion