--- egg/wnn.el.orig	2015-01-31 19:24:09.000000000 +0900
+++ egg/wnn.el	2015-02-02 00:53:09.000000000 +0900
@@ -82,6 +82,10 @@
 			     (const wnn-uniq)
 			     (const wnn-uniq-kanji)))
 
+(defcustom egg-wnn-helper-path "egg-helper"
+  "path of wnn unix domain connection helper program"
+  :group 'wnn :type 'file)
+
 (defcustom wnn-jserver nil
   "jserver hostname list.  Use N-th port, if hostname is followed
 by ':' and digit N."
@@ -99,11 +103,21 @@
  by ':' and digit N."
   :group 'wnn :type '(repeat string))
 
+(setq wnn-jserverenv "JSERVER")
+(setq wnn-cserverenv "CSERVER")
+(setq wnn-tserverenv "TSERVER")
+(setq wnn-kserverenv "KSERVER")
+
 (defcustom wnn-jport 22273 "jserver port number" :group 'wnn :type 'integer)
 (defcustom wnn-cport 22289 "cserver port number" :group 'wnn :type 'integer)
 (defcustom wnn-tport 22321 "tserver port number" :group 'wnn :type 'integer)
 (defcustom wnn-kport 22305 "kserver port number" :group 'wnn :type 'integer)
 
+(defcustom wnn-judpath "/tmp/jd_sockV4" "jserver unix domain socket name" :group 'wnn :type 'string)
+(defcustom wnn-cudpath "/tmp/cd_sockV4" "cserver unix domain socket name" :group 'wnn :type 'string)
+(defcustom wnn-tudpath "/tmp/td_sockV4" "tserver unix domain socket name" :group 'wnn :type 'string)
+(defcustom wnn-kudpath "/tmp/kd_sockV4" "kserver unix domain socket name" :group 'wnn :type 'string)
+
 (defmacro wnn-backend-plist ()
   ''(egg-initialize-backend        wnn-init
      egg-start-conversion          wnn-start-conversion
@@ -128,7 +142,7 @@
 (defun wnn-make-backend (lang env &optional source-lang converted-lang)
   (let ((finalize (wnn-backend-func-name "wnn-finalize-backend" lang))
 	(backend (wnn-backend-func-name "wnn-backend" lang env)))
-    (if (null (fboundp finalize))
+    (if (null (fboundp 'finalize))
 	(progn
 	  (fset finalize `(lambda () (wnn-finalize-backend ',lang)))
 	  (egg-set-finalize-backend (list finalize))))
@@ -559,11 +573,11 @@
 	  bunsetsu))
 
 (defvar wnn-server-info-list
-  ;; language    server  port      hostname    proc   coding-system
-  '((Japanese    jserver wnn-jport wnn-jserver "Wnn"  (fixed-euc-jp    fixed-euc-jp))
-    (Chinese-GB  cserver wnn-cport wnn-cserver "cWnn" (fixed-euc-py-cn fixed-euc-zy-cn))
-    (Chinese-CNS tserver wnn-tport wnn-tserver "tWnn" (fixed-euc-py-tw fixed-euc-zy-tw))
-    (Korean      kserver wnn-kport wnn-kserver "kWnn" (fixed-euc-kr    fixed-euc-kr))))
+  ;; language    server  port      hostname    unixdomain  serverenv      proc   coding-system
+  '((Japanese    jserver wnn-jport wnn-jserver wnn-judpath wnn-jserverenv "Wnn"  (fixed-euc-jp    fixed-euc-jp))
+    (Chinese-GB  cserver wnn-cport wnn-cserver wnn-cudpath wnn-cserverenv "cWnn" (fixed-euc-py-cn fixed-euc-zy-cn))
+    (Chinese-CNS tserver wnn-tport wnn-tserver wnn-tudpath wnn-tserverenv "tWnn" (fixed-euc-py-tw fixed-euc-zy-tw))
+    (Korean      kserver wnn-kport wnn-kserver wnn-kudpath wnn-kserverenv "kWnn" (fixed-euc-kr    fixed-euc-kr))))
 
 (defsubst wnn-server-get-info (lang)
   (or (assq lang wnn-server-info-list)
@@ -577,12 +591,16 @@
   (symbol-value (nth 2 info)))
 (defsubst wnn-server-hostname (info)
   (symbol-value (nth 3 info)))
+(defsubst wnn-server-udpath-name (info)
+  (symbol-value (nth 4 info)))
+(defsubst wnn-server-env-name (info)
+  (symbol-value (nth 5 info)))
 (defsubst wnn-server-proc-name (info)
-  (nth 4 info))
+  (nth 6 info))
 (defsubst wnn-server-buffer-name (info)
   (concat " *" (wnn-server-proc-name info) "*"))
 (defsubst wnn-server-coding-system (info)
-  (nth 5 info))
+  (nth 7 info))
 
 (defconst wnn-accept-charset-alist
   '((Chinese-CNS ascii chinese-sisheng chinese-cns11643-1 chinese-cns11643-2)))
@@ -1209,14 +1227,15 @@
 	(port (wnn-server-port server-info))
 	(hostname-list (wnn-server-hostname server-info))
 	(proc-name (wnn-server-proc-name server-info))
+	(udpath (wnn-server-udpath-name server-info))
+	(serverenv (wnn-server-env-name server-info))
 	(msg-form "Wnn: connecting to %S at %s...")
 	(user-name (user-login-name))
-	buf hostname myname port-off proc result msg)
+	buf hostname port-off proc result msg)
     (unwind-protect
 	(progn
 	  (setq buf (generate-new-buffer (wnn-server-buffer-name server-info)))
-	  (save-excursion
-	    (set-buffer buf)
+	  (with-current-buffer buf
 	    (erase-buffer)
 	    (buffer-disable-undo)
 	    (set-buffer-multibyte nil)
@@ -1225,13 +1244,24 @@
 	      (setq hostname-list (list hostname-list)))
 	  (while (and hostname-list (null proc))
 	    (setq hostname (or (car hostname-list) "")
-		  hostname-list (cdr hostname-list)
-		  myname (if (equal hostname "") "unix" wnn-system-name))
-	    (if (null (string-match ":" hostname))
-		(setq port-off 0)
-	      (setq port-off (string-to-int (substring hostname (match-end 0)))
-		    hostname (substring hostname 0 (match-beginning 0))))
-	    (and (equal hostname "") (setq hostname "localhost"))
+		hostname-list (cdr hostname-list))
+	    (if (or (and (getenv serverenv)
+			 (string-match "^unix$" (getenv serverenv)))
+		    (and (null (getenv serverenv))
+			 (or (equal hostname "")
+			     (string-match "^unix$" hostname))))
+		(progn
+		  (setq hostname "unix"
+			family 'local
+			port udpath))
+	       (progn
+		(setq hostname (or (getenv serverenv) hostname "localhost"))
+		(if (null (string-match ":" hostname))
+		    (setq port-off 0)
+		  (setq port-off (string-to-number (substring hostname (match-end 0)))
+			hostname (substring hostname 0 (match-beginning 0))))
+		(setq family nil)))
+	    (setq host hostname)
 	    (let ((inhibit-quit save-inhibit-quit))
 	      (if (and msg
 		       (null (y-or-n-p (format "%s failed. Try to %s? "
@@ -1241,16 +1271,22 @@
 			      server-type hostname))
 	    (message "%s" msg)
 	    (let ((inhibit-quit save-inhibit-quit))
-	      (condition-case nil
-		  (setq proc (open-network-stream proc-name buf hostname
-						  (+ port port-off)))
-		((error quit))))
-	    (when proc
-	      (process-kill-without-query proc)
+             (if (fboundp 'make-network-process)
+                 (condition-case nil
+                     (setq proc (make-network-process :name proc-name :buffer buf :host host :service port :family family))
+                   ((error quit)))
+               (if (string-match "^unix$" hostname)
+                   (let ((process-connection-type nil))
+                     (setq proc (start-process proc-name buf egg-wnn-helper-path port)))
+                 (condition-case nil
+                     (setq proc (open-network-stream proc-name buf hostname port))
+                   (error quit)))))
+           (when (processp proc)
+	      (set-process-query-on-exit-flag proc nil)
 	      (set-process-coding-system proc 'binary 'binary)
 	      (set-process-sentinel proc 'wnn-comm-sentinel)
 	      (set-marker-insertion-type (process-mark proc) t)
-	      (setq result (wnnrpc-open proc myname user-name))
+	      (setq result (wnnrpc-open proc host user-name))
 	      (when (numberp result)
 		(delete-process proc)
 		(setq proc nil))))
