From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Yoni Rabkin Newsgroups: gmane.emacs.devel Subject: Re: improving network utility calls in lisp/net/net-utils.el Date: Sat, 11 Apr 2009 11:47:23 +0300 Message-ID: <874owvk25g.fsf@rabkins.net> References: <87ljq8lk9u.fsf@rabkins.net> <87y6u8k3bo.fsf@rabkins.net> <49DF7679.20700@harpegolden.net> <87eiw0v1eq.fsf@rabkins.net> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1239439473 26197 80.91.229.12 (11 Apr 2009 08:44:33 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 11 Apr 2009 08:44:33 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat Apr 11 10:45:51 2009 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LsYqU-0004OE-P4 for ged-emacs-devel@m.gmane.org; Sat, 11 Apr 2009 10:45:51 +0200 Original-Received: from localhost ([127.0.0.1]:41875 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LsYp5-0002hN-Vs for ged-emacs-devel@m.gmane.org; Sat, 11 Apr 2009 04:44:24 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LsYp0-0002hG-Ke for emacs-devel@gnu.org; Sat, 11 Apr 2009 04:44:18 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LsYot-0002gS-W5 for emacs-devel@gnu.org; Sat, 11 Apr 2009 04:44:17 -0400 Original-Received: from [199.232.76.173] (port=53782 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LsYot-0002gP-Rk for emacs-devel@gnu.org; Sat, 11 Apr 2009 04:44:11 -0400 Original-Received: from mailgw.comm.net.il ([193.238.208.251]:49250) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LsYot-0008Ja-65 for emacs-devel@gnu.org; Sat, 11 Apr 2009 04:44:11 -0400 Original-Received: from comm.net.il ([193.238.208.2]) by mailgw.comm.net.il (8.14.1/8.14.1) with ESMTP id n3BAAHWX002246 for ; Sat, 11 Apr 2009 13:10:17 +0300 Original-Received: from ardbeg.rabkins.net ([62.56.255.2]) by gondor.icomm.co.il with MailEnable ESMTP; Sat, 11 Apr 2009 11:45:16 +0200 X-Ethics: Use GNU In-Reply-To: (Stefan Monnier's message of "Fri, 10 Apr 2009 18:13:30 -0400") User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.92 (gnu/linux) X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 2) X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:110208 Archived-At: --=-=-= Stefan Monnier writes: >> As a user of both Dired and Gnus I'm well accustomed to waiting for >> Emacs to synchronously go fetch something. I agree to wait because of >> the quality of the interface I'll get when the process is done. > > There's no connection between the two. I only object to the change to > sync processes. The rest looks like good changes. I've attached a patch that calls all of the processes asynchronously, uses `special-mode' and modifies `net-utils-font-lock-keywords' conservatively (according to David's multi-platform argument). --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=net-utils-improved-utility-calls-3.patch ? net-utils-improved-utility-calls-2.patch ? net-utils-improved-utility-calls-3.patch ? net-utils-improved-utility-calls.patch ? net-utils.patch ? lisp/mail/subdirs.el ? lisp/nxml/char-name/subdirs.el Index: lisp/net/net-utils.el =================================================================== RCS file: /sources/emacs/emacs/lisp/net/net-utils.el,v retrieving revision 1.37 diff -u -r1.37 net-utils.el --- lisp/net/net-utils.el 5 Jan 2009 03:22:45 -0000 1.37 +++ lisp/net/net-utils.el 11 Apr 2009 08:33:43 -0000 @@ -260,6 +260,38 @@ "Expressions to font-lock for nslookup.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; General network utilities mode +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defconst net-utils-font-lock-keywords + (list + ;; Dotted quads + (list + (mapconcat 'identity (make-list 4 "[0-9]+") "\\.") + 0 'font-lock-variable-name-face) + ;; Simple rfc4291 addresses + (list (concat + "\\( \\([[:xdigit:]]+\\(:\\|::\\)\\)+[[:xdigit:]]+\\)" + "\\|" + "\\(::[[:xdigit:]]+\\)") + 0 'font-lock-variable-name-face) + ;; Host names + (list + (let ((host-expression "[-A-Za-z0-9]+")) + (concat + (mapconcat 'identity (make-list 2 host-expression) "\\.") + "\\(\\." host-expression "\\)*")) + 0 'font-lock-variable-name-face)) + "Expressions to font-lock for general network utilities.") + +(define-derived-mode net-utils-mode special-mode "NetworkUtil" + "Major mode for interacting with an external network utility." + (set + (make-local-variable 'font-lock-defaults) + '((net-utils-font-lock-keywords))) + (use-local-map net-utils-mode-map)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -288,7 +320,6 @@ (skip-chars-backward ":;.,!?" pt) (point))))) - (defun net-utils-remove-ctrl-m-filter (process output-string) "Remove trailing control Ms." (let ((old-buffer (current-buffer)) @@ -296,17 +327,18 @@ (unwind-protect (let ((moving)) (set-buffer (process-buffer process)) - (setq moving (= (point) (process-mark process))) + (let ((inhibit-read-only t)) + (setq moving (= (point) (process-mark process))) - (while (string-match "\r" filtered-string) - (setq filtered-string - (replace-match "" nil nil filtered-string))) - - (save-excursion - ;; Insert the text, moving the process-marker. - (goto-char (process-mark process)) - (insert filtered-string) - (set-marker (process-mark process) (point))) + (while (string-match "\r" filtered-string) + (setq filtered-string + (replace-match "" nil nil filtered-string))) + + (save-excursion + ;; Insert the text, moving the process-marker. + (goto-char (process-mark process)) + (insert filtered-string) + (set-marker (process-mark process) (point)))) (if moving (goto-char (process-mark process)))) (set-buffer old-buffer)))) @@ -323,6 +355,42 @@ buf)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; General network utilities (diagnostic) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun net-utils-run-simple (buffer-name program-name args) + "Run a network utility for diagnostic output only." + (interactive) + (when (get-buffer buffer-name) + (kill-buffer buffer-name)) + (get-buffer-create buffer-name) + (with-current-buffer buffer-name + (net-utils-mode) + (set-process-filter + (apply 'start-process (format "%s" program-name) + buffer-name program-name args) + 'net-utils-remove-ctrl-m-filter) + (goto-char (point-min))) + (display-buffer buffer-name)) + +(defmacro net-utils-defutil (fname program-name args) + (let ((doc (format "Run %s and display diagnostic output." + fname))) + `(defun ,fname () + ,doc + (interactive) + (net-utils-run-simple + (format "*%s*" ,program-name) + ,program-name + ,args)))) + +(net-utils-defutil ifconfig ifconfig-program ifconfig-program-options) +(net-utils-defutil iwconfig iwconfig-program iwconfig-program-options) +(net-utils-defutil netstat netstat-program netstat-program-options) +(net-utils-defutil arp arp-program arp-program-options) +(net-utils-defutil route route-program route-program-options) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Wrappers for external network programs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -357,60 +425,6 @@ ping-program options))) -;;;###autoload -(defun ifconfig () - "Run ifconfig program." - (interactive) - (net-utils-run-program - "Ifconfig" - (concat "** Ifconfig ** " ifconfig-program " ** ") - ifconfig-program - ifconfig-program-options)) - -;; Windows uses this name. -;;;###autoload -(defalias 'ipconfig 'ifconfig) - -;;;###autoload -(defun iwconfig () - "Run iwconfig program." - (interactive) - (net-utils-run-program - "Iwconfig" - (concat "** Iwconfig ** " iwconfig-program " ** ") - iwconfig-program - iwconfig-program-options)) - -;;;###autoload -(defun netstat () - "Run netstat program." - (interactive) - (net-utils-run-program - "Netstat" - (concat "** Netstat ** " netstat-program " ** ") - netstat-program - netstat-program-options)) - -;;;###autoload -(defun arp () - "Run arp program." - (interactive) - (net-utils-run-program - "Arp" - (concat "** Arp ** " arp-program " ** ") - arp-program - arp-program-options)) - -;;;###autoload -(defun route () - "Run route program." - (interactive) - (net-utils-run-program - "Route" - (concat "** Route ** " route-program " ** ") - route-program - route-program-options)) - ;; FIXME -- Needs to be a process filter ;; (defun netstat-with-filter (filter) ;; "Run netstat program." --=-=-= -- "Cut your own wood and it will warm you twice" --=-=-=--