-;;; net-utils.el --- Network functions
+;;; net-utils.el --- network functions
+
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Peter Breton <pbreton@cs.umb.edu>
;; Created: Sun Mar 16 1997
-;; Keywords: network communications
-;; Time-stamp: <2000-10-04 22:39:05 pbreton>
+;; Keywords: network comm
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs 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.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; 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.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
+
;;
;; There are three main areas of functionality:
;;
;;; Code:
-(eval-when-compile
- (require 'comint))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Customization Variables
"Network utility functions."
:prefix "net-utils-"
:group 'comm
- :version "20.3"
- )
+ :version "20.3")
(defcustom net-utils-remove-ctl-m
(member system-type (list 'windows-nt 'msdos))
"If non-nil, remove control-Ms from output."
:group 'net-utils
- :type 'boolean
- )
+ :type 'boolean)
(defcustom traceroute-program
(if (eq system-type 'windows-nt)
"traceroute")
"Program to trace network hops to a destination."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom traceroute-program-options nil
"Options for the traceroute program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
(defcustom ping-program "ping"
"Program to send network test packets to a host."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
-;; On Linux and Irix, the system's ping program seems to send packets
+;; On GNU/Linux and Irix, the system's ping program seems to send packets
;; indefinitely unless told otherwise
(defcustom ping-program-options
(and (memq system-type (list 'linux 'gnu/linux 'irix))
"Options for the ping program.
These options can be used to limit how many ICMP packets are emitted."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
+
+(define-obsolete-variable-alias 'ipconfig-program 'ifconfig-program "22.2")
-(defcustom ipconfig-program
+(defcustom ifconfig-program
(if (eq system-type 'windows-nt)
"ipconfig"
"ifconfig")
"Program to print network configuration information."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
-(defcustom ipconfig-program-options
- (list
- (if (eq system-type 'windows-nt)
- "/all" "-a"))
- "Options for ipconfig-program."
+(defcustom ifconfig-program-options
+ (list
+ (if (eq system-type 'windows-nt)
+ "/all" "-a"))
+ "Options for the ifconfig program."
+ :group 'net-utils
+ :type '(repeat string))
+
+(defcustom iwconfig-program "iwconfig"
+ "Program to print wireless network configuration information."
:group 'net-utils
- :type '(repeat string)
- )
+ :type 'string
+ :version "23.1")
+
+(define-obsolete-variable-alias 'ipconfig-program-options
+ 'ifconfig-program-options "22.2")
+
+(defcustom iwconfig-program-options nil
+ "Options for the iwconfig program."
+ :group 'net-utils
+ :type '(repeat string)
+ :version "23.1")
-(defcustom netstat-program "netstat"
+(defcustom netstat-program "netstat"
"Program to print network statistics."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom netstat-program-options
(list "-a")
- "Options for netstat-program."
+ "Options for the netstat program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
-(defcustom arp-program "arp"
+(defcustom arp-program "arp"
"Program to print IP to address translation tables."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom arp-program-options
(list "-a")
- "Options for arp-program."
+ "Options for the arp program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
(defcustom route-program
(if (eq system-type 'windows-nt)
"netstat")
"Program to print routing tables."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom route-program-options
(if (eq system-type 'windows-nt)
(list "print")
(list "-r"))
- "Options for route-program."
+ "Options for the route program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
-(defcustom nslookup-program "nslookup"
+(defcustom nslookup-program "nslookup"
"Program to interactively query DNS information."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
-(defcustom nslookup-program-options nil
- "List of options to pass to the nslookup program."
+(defcustom nslookup-program-options nil
+ "Options for the nslookup program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
(defcustom nslookup-prompt-regexp "^> "
"Regexp to match the nslookup prompt.
This variable is only used if the variable
-`comint-use-prompt-regexp-instead-of-fields' is non-nil."
+`comint-use-prompt-regexp' is non-nil."
:group 'net-utils
- :type 'regexp
- )
+ :type 'regexp)
-(defcustom dig-program "dig"
+(defcustom dig-program "dig"
"Program to query DNS information."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom ftp-program "ftp"
- "Progam to run to do FTP transfers."
+ "Program to run to do FTP transfers."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom ftp-program-options nil
- "List of options to pass to the FTP program."
+ "Options for the ftp program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
(defcustom ftp-prompt-regexp "^ftp>"
"Regexp which matches the FTP program's prompt.
This variable is only used if the variable
-`comint-use-prompt-regexp-instead-of-fields' is non-nil."
+`comint-use-prompt-regexp' is non-nil."
:group 'net-utils
- :type 'regexp
- )
+ :type 'regexp)
(defcustom smbclient-program "smbclient"
"Smbclient program."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom smbclient-program-options nil
- "List of options to pass to the smbclient program."
+ "Options for the smbclient program."
:group 'net-utils
- :type '(repeat string)
- )
+ :type '(repeat string))
(defcustom smbclient-prompt-regexp "^smb: \>"
"Regexp which matches the smbclient program's prompt.
This variable is only used if the variable
-`comint-use-prompt-regexp-instead-of-fields' is non-nil."
+`comint-use-prompt-regexp' is non-nil."
+ :group 'net-utils
+ :type 'regexp)
+
+(defcustom dns-lookup-program "host"
+ "Program to interactively query DNS information."
:group 'net-utils
- :type 'regexp
- )
+ :type 'string)
+
+(defcustom dns-lookup-program-options nil
+ "Options for the dns-lookup program."
+ :group 'net-utils
+ :type '(repeat string))
;; Internal variables
(defvar network-connection-service nil)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst nslookup-font-lock-keywords
- (progn
- (require 'font-lock)
- (list
- (list "^[A-Za-z0-9 _]+:" 0 font-lock-type-face)
- (list "\\<\\(SOA\\|NS\\|MX\\|A\\|CNAME\\)\\>"
- 1 font-lock-keyword-face)
- ;; Dotted quads
- (list
- (mapconcat 'identity
- (make-list 4 "[0-9]+")
- "\\.")
- 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)
- ))
+ (list
+ (list "^[A-Za-z0-9 _]+:" 0 'font-lock-type-face)
+ (list "\\<\\(SOA\\|NS\\|MX\\|A\\|CNAME\\)\\>"
+ 1 'font-lock-keyword-face)
+ ;; Dotted quads
+ (list
+ (mapconcat 'identity
+ (make-list 4 "[0-9]+")
+ "\\.")
+ 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 nslookup.")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(if moving (goto-char (process-mark process))))
(set-buffer old-buffer))))
-(defmacro net-utils-run-program (name header program &rest args)
+(defun net-utils-run-program (name header program args)
"Run a network information program."
- ` (let ((buf (get-buffer-create (concat "*" ,name "*"))))
- (set-buffer buf)
- (erase-buffer)
- (insert ,header "\n")
- (set-process-filter
- (apply 'start-process ,name buf ,program ,@args)
- 'net-utils-remove-ctrl-m-filter)
- (display-buffer buf)
- buf))
+ (let ((buf (get-buffer-create (concat "*" name "*"))))
+ (set-buffer buf)
+ (erase-buffer)
+ (insert header "\n")
+ (set-process-filter
+ (apply 'start-process name buf program args)
+ 'net-utils-remove-ctrl-m-filter)
+ (display-buffer buf)
+ buf))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Wrappers for external network programs
(concat "Traceroute" " " target)
(concat "** Traceroute ** " traceroute-program " ** " target)
traceroute-program
- options
- )))
+ options)))
;;;###autoload
(defun ping (host)
(concat "Ping" " " host)
(concat "** Ping ** " ping-program " ** " host)
ping-program
- options
- )))
+ options)))
;;;###autoload
-(defun ipconfig ()
- "Run ipconfig program."
+(defun ifconfig ()
+ "Run ifconfig program."
(interactive)
(net-utils-run-program
- "Ipconfig"
- (concat "** Ipconfig ** " ipconfig-program " ** ")
- ipconfig-program
- ipconfig-program-options
- ))
+ "Ifconfig"
+ (concat "** Ifconfig ** " ifconfig-program " ** ")
+ ifconfig-program
+ ifconfig-program-options))
-;; This is the normal name on most Unixes.
+;; Windows uses this name.
;;;###autoload
-(defalias 'ifconfig 'ipconfig)
+(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 ()
"Netstat"
(concat "** Netstat ** " netstat-program " ** ")
netstat-program
- netstat-program-options
- ))
+ netstat-program-options))
;;;###autoload
(defun arp ()
- "Run the arp program."
+ "Run arp program."
(interactive)
(net-utils-run-program
"Arp"
(concat "** Arp ** " arp-program " ** ")
arp-program
- arp-program-options
- ))
+ arp-program-options))
;;;###autoload
(defun route ()
- "Run the route program."
+ "Run route program."
(interactive)
(net-utils-run-program
"Route"
(concat "** Route ** " route-program " ** ")
route-program
- route-program-options
- ))
+ route-program-options))
;; FIXME -- Needs to be a process filter
;; (defun netstat-with-filter (filter)
;; (netstat)
;; (set-buffer (get-buffer "*Netstat*"))
;; (goto-char (point-min))
-;; (delete-matching-lines filter)
-;; )
+;; (delete-matching-lines filter))
;;;###autoload
(defun nslookup-host (host)
(list "Nslookup" host nslookup-program)
" ** "))
nslookup-program
- options
- )))
-
+ options)))
;;;###autoload
(defun nslookup ()
"Run nslookup program."
(interactive)
- (require 'comint)
(comint-run nslookup-program)
- (nslookup-mode)
- )
+ (nslookup-mode))
+
+(defvar comint-prompt-regexp)
+(defvar comint-input-autoexpand)
+
+(autoload 'comint-mode "comint" nil t)
;; Using a derived mode gives us keymaps, hooks, etc.
(define-derived-mode nslookup-mode comint-mode "Nslookup"
(set
(make-local-variable 'font-lock-defaults)
'((nslookup-font-lock-keywords)))
- (setq local-abbrev-table nslookup-mode-abbrev-table)
- (abbrev-mode t)
(setq comint-prompt-regexp nslookup-prompt-regexp)
- (setq comint-input-autoexpand t)
- )
+ (setq comint-input-autoexpand t))
(define-key nslookup-mode-map "\t" 'comint-dynamic-complete)
-(define-abbrev nslookup-mode-abbrev-table "e" "exit")
-(define-abbrev nslookup-mode-abbrev-table "f" "finger")
-(define-abbrev nslookup-mode-abbrev-table "h" "help")
-(define-abbrev nslookup-mode-abbrev-table "lse" "lserver")
-(define-abbrev nslookup-mode-abbrev-table "q" "exit")
-(define-abbrev nslookup-mode-abbrev-table "r" "root")
-(define-abbrev nslookup-mode-abbrev-table "s" "set")
-(define-abbrev nslookup-mode-abbrev-table "se" "server")
-(define-abbrev nslookup-mode-abbrev-table "v" "viewer")
+;;;###autoload
+(defun dns-lookup-host (host)
+ "Lookup the DNS information for HOST (name or IP address)."
+ (interactive
+ (list (read-from-minibuffer "Lookup host: " (net-utils-machine-at-point))))
+ (let ((options
+ (if dns-lookup-program-options
+ (append dns-lookup-program-options (list host))
+ (list host))))
+ (net-utils-run-program
+ (concat "DNS Lookup [" host "]")
+ (concat "** "
+ (mapconcat 'identity
+ (list "DNS Lookup" host dns-lookup-program)
+ " ** "))
+ dns-lookup-program
+ options)))
+
+(autoload 'ffap-string-at-point "ffap")
;;;###autoload
-(defun dig (host)
+(defun run-dig (host)
"Run dig program."
(interactive
(list
- (progn
- (require 'ffap)
- (read-from-minibuffer
- "Lookup host: "
- (or (ffap-string-at-point 'machine) "")))))
+ (read-from-minibuffer "Lookup host: "
+ (or (ffap-string-at-point 'machine) ""))))
(net-utils-run-program
"Dig"
(concat "** "
(list "Dig" host dig-program)
" ** "))
dig-program
- (list host)
- ))
+ (list host)))
+
+(autoload 'comint-exec "comint")
;; This is a lot less than ange-ftp, but much simpler.
;;;###autoload
(list
(read-from-minibuffer
"Ftp to Host: " (net-utils-machine-at-point))))
- (require 'comint)
(let ((buf (get-buffer-create (concat "*ftp [" host "]*"))))
(set-buffer buf)
(ftp-mode)
(unless (memq 'comint-watch-for-password-prompt
(default-value 'comint-output-filter-functions))
(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt
- nil t))
- (setq local-abbrev-table ftp-mode-abbrev-table)
- (abbrev-mode t)
- )
-
-(define-abbrev ftp-mode-abbrev-table "q" "quit")
-(define-abbrev ftp-mode-abbrev-table "g" "get")
-(define-abbrev ftp-mode-abbrev-table "p" "prompt")
-(define-abbrev ftp-mode-abbrev-table "anon" "anonymous")
+ nil t)))
;; Occasionally useful
(define-key ftp-mode-map "\t" 'comint-dynamic-complete)
(read-from-minibuffer
"Connect to Host: " (net-utils-machine-at-point))
(read-from-minibuffer "SMB Service: ")))
- (require 'comint)
(let* ((name (format "smbclient [%s\\%s]" host service))
(buf (get-buffer-create (concat "*" name "*")))
(service-name (concat "\\\\" host "\\" service)))
(interactive
(list
(read-from-minibuffer
- "Connect to Host: " (net-utils-machine-at-point))
- ))
+ "Connect to Host: " (net-utils-machine-at-point))))
(let ((buf (get-buffer-create (format "*SMB Shares on %s*" host))))
(set-buffer buf)
(smbclient-mode)
(unless (memq 'comint-watch-for-password-prompt
(default-value 'comint-output-filter-functions))
(add-hook 'comint-output-filter-functions 'comint-watch-for-password-prompt
- nil t))
- (setq local-abbrev-table smbclient-mode-abbrev-table)
- (abbrev-mode t)
- )
-
-(define-abbrev smbclient-mode-abbrev-table "q" "quit")
+ nil t)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Full list is available at:
-;; ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers
+;; http://www.iana.org/assignments/port-numbers
(defvar network-connection-service-alist
(list
(cons 'echo 7)
(cons 'netbios-data 139)
(cons 'irc 194)
(cons 'https 443)
- (cons 'rlogin 513)
- )
+ (cons 'rlogin 513))
"Alist of services and associated TCP port numbers.
-This list in not complete.")
-
-;; Workhorse macro
-(defmacro run-network-program (process-name host port
- &optional initial-string)
- `(let ((tcp-connection)
- (buf)
- )
- (setq buf (get-buffer-create (concat "*" ,process-name "*")))
+This list is not complete.")
+
+;; Workhorse routine
+(defun run-network-program (process-name host port &optional initial-string)
+ (let ((tcp-connection)
+ (buf))
+ (setq buf (get-buffer-create (concat "*" process-name "*")))
(set-buffer buf)
(or
(setq tcp-connection
- (open-network-stream
- ,process-name
- buf
- ,host
- ,port
- ))
- (error "Could not open connection to %s" ,host))
+ (open-network-stream process-name buf host port))
+ (error "Could not open connection to %s" host))
(erase-buffer)
(set-marker (process-mark tcp-connection) (point-min))
(set-process-filter tcp-connection 'net-utils-remove-ctrl-m-filter)
- (and ,initial-string
+ (and initial-string
(process-send-string tcp-connection
- (concat ,initial-string "\r\n")))
+ (concat initial-string "\r\n")))
(display-buffer buf)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(process-name (concat "Finger [" user-and-host "]"))
(regexps finger-X.500-host-regexps)
found)
- (while (and regexps (not (string-match (car regexps) host)))
- (setq regexps (cdr regexps)))
- (when regexps
- (setq user-and-host user))
+ (and regexps
+ (while (not (string-match (car regexps) host))
+ (setq regexps (cdr regexps)))
+ (when regexps
+ (setq user-and-host user)))
(run-network-program
process-name
host
(defcustom whois-server-name "rs.internic.net"
"Default host name for the whois service."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
(defcustom whois-server-list
'(("whois.arin.net") ; Networks, ASN's, and related POC's (numbers)
("rs.internic.net") ; domain related info
+ ("whois.publicinterestregistry.net")
("whois.abuse.net")
("whois.apnic.net")
("nic.ddn.mil")
:group 'net-utils
:type '(repeat (list string)))
+;; FIXME: modern whois clients include a much better tld <-> whois server
+;; list, Emacs should probably avoid specifying the server as the client
+;; will DTRT anyway... -rfr
(defcustom whois-server-tld
'(("rs.internic.net" . "com")
- ("rs.internic.net" . "org")
+ ("whois.publicinterestregistry.net" . "org")
("whois.ripe.net" . "be")
("whois.ripe.net" . "de")
("whois.ripe.net" . "dk")
(defcustom whois-guess-server t
"If non-nil then whois will try to deduce the appropriate whois
server from the query. If the query doesn't look like a domain or hostname
-then the server named by whois-server-name is used."
+then the server named by `whois-server-name' is used."
:group 'net-utils
:type 'boolean)
"Whois"
host
(cdr (assoc 'whois network-connection-service-alist))
- search-string
- )))
+ search-string)))
(defcustom whois-reverse-lookup-server "whois.arin.net"
"Server which provides inverse DNS mapping."
:group 'net-utils
- :type 'string
- )
+ :type 'string)
;;;###autoload
(defun whois-reverse-lookup ()
;; Using a derived mode gives us keymaps, hooks, etc.
(define-derived-mode
network-connection-mode comint-mode "Network-Connection"
- "Major mode for interacting with the network-connection program."
- )
+ "Major mode for interacting with the network-connection program.")
(defun network-connection-mode-setup (host service)
- (let ((network-abbrev-table
- (or
- (assoc service network-connection-service-abbrev-alist)
- (and (rassoc service network-connection-service-alist)
- (assoc
- (elt (rassoc service network-connection-service-alist) 0)
- network-connection-service-abbrev-alist)))))
- (make-local-variable 'network-connection-host)
- (setq network-connection-host host)
- (make-local-variable 'network-connection-service)
- (setq network-connection-service service)
- (and network-abbrev-table
- (setq local-abbrev-table (cdr network-abbrev-table))
- (abbrev-mode t)
- )))
+ (make-local-variable 'network-connection-host)
+ (setq network-connection-host host)
+ (make-local-variable 'network-connection-service)
+ (setq network-connection-service service))
;;;###autoload
(defun network-connection-to-service (host service)
network-connection-service-alist))))
(network-connection
host
- (cdr (assoc (intern service) network-connection-service-alist)))
- )
+ (cdr (assoc (intern service) network-connection-service-alist))))
;;;###autoload
(defun network-connection (host port)
(defun network-service-connection (host service)
"Open a network connection to SERVICE on HOST."
- (require 'comint)
- (let* (
- (process-name (concat "Network Connection [" host " " service "]"))
- (portnum (string-to-number service))
- (buf (get-buffer-create (concat "*" process-name "*")))
- )
+ (let* ((process-name (concat "Network Connection [" host " " service "]"))
+ (portnum (string-to-number service))
+ (buf (get-buffer-create (concat "*" process-name "*"))))
(or (zerop portnum) (setq service portnum))
(make-comint
process-name
(set-buffer buf)
(network-connection-mode)
(network-connection-mode-setup host service)
- (pop-to-buffer buf)
- ))
+ (pop-to-buffer buf)))
+
+(defvar comint-input-ring)
(defun network-connection-reconnect ()
"Reconnect a network connection, preserving the old input ring."
(let ((proc (get-buffer-process (current-buffer)))
(old-comint-input-ring comint-input-ring)
(host network-connection-host)
- (service network-connection-service)
- )
+ (service network-connection-service))
(if (not (or (not proc)
(eq (process-status proc) 'closed)))
(message "Still connected")
(goto-char (point-max))
(insert (format "Reopening connection to %s\n" host))
(network-connection host
- (if (numberp service)
- service
- (cdr (assoc service network-connection-service-alist))))
+ (if (numberp service)
+ service
+ (cdr (assoc service network-connection-service-alist))))
(and old-comint-input-ring
- (setq comint-input-ring old-comint-input-ring))
- )))
+ (setq comint-input-ring old-comint-input-ring)))))
(provide 'net-utils)
+;; arch-tag: 97119e91-9edb-4376-838b-bf7058fa1314
;;; net-utils.el ends here