X-Git-Url: https://cgit.sxemacs.org/?a=blobdiff_plain;f=lisp%2Friece-async.el;h=930a2c36382870b2c42506c31bc6e7dc8f794789;hb=d080467e2726a99eecfa48a3153ba0a9d602ed4a;hp=0a1b371618b0a569b46920724e3cdfd4d21b6946;hpb=07b5d6254cd1cd9e870640a5f9cfbf5964cc07b2;p=riece diff --git a/lisp/riece-async.el b/lisp/riece-async.el index 0a1b371..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-" @@ -50,61 +52,63 @@ (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, wfds = select([socket, $stdin], wfds_in) - if wfds.delete($stdout) + 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.delete($stdout) + wfds_in = [] rescue Errno::EAGAIN end end - if rfds.delete(socket) - line = socket.gets(\"\r\n\") + 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 wfds_in = [$stdout] buf << line - until buf.length <= " max-buffer-size " - buf.slice!(0 .. buf.index(\"\r\n\")) - end 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" + "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))