(viqr-pre-write-conversion): Cancel previous
[bpt/emacs.git] / lisp / net-utils.el
CommitLineData
e65f17fe
DN
1;;; net-utils.el --- Network functions
2
3;; Author: Peter Breton <pbreton@cs.umb.edu>
4;; Created: Sun Mar 16 1997
5;; Keywords: network communications
6;; Time-stamp: <1998-06-13 06:19:01 pbreton>
7
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
12;; the Free Software Foundation; either version 2, or (at your option)
13;; any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
21;; along with GNU Emacs; see the file COPYING. If not, write to the
22;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23;; Boston, MA 02111-1307, USA.
24
25;;; Commentary:
26;;
27;; There are three main areas of functionality:
28;;
29;; * Wrap common network utility programs (ping, traceroute, netstat,
30;; nslookup, arp, route). Note that these wrappers are of the diagnostic
31;; functions of these programs only.
32;;
33;; * Implement some very basic protocols in Emacs Lisp (finger and whois)
34;;
35;; * Support connections to HOST/PORT, generally for debugging and the like.
36;; In other words, for doing much the same thing as "telnet HOST PORT", and
37;; then typing commands.
38;;
39;; PATHS
40;;
41;; On some systems, some of these programs are not in normal user path,
42;; but rather in /sbin, /usr/sbin, and so on.
43
44
45;;; Code:
46(eval-when-compile
380c917d 47 (require 'comint))
e65f17fe
DN
48
49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50;; Customization Variables
51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
52
53(defgroup net-utils nil
54 "Network utility functions."
55 :prefix "net-utils-"
56 :group 'comm
57 :version "20.3"
58 )
59
60(defcustom net-utils-remove-ctl-m
61 (member system-type (list 'windows-nt 'msdos))
62 "If non-nil, remove control-Ms from output."
63 :group 'net-utils
64 :type 'boolean
65 )
66
67(defcustom traceroute-program
68 (if (eq system-type 'windows-nt)
69 "tracert"
70 "traceroute")
71 "Program to trace network hops to a destination."
72 :group 'net-utils
73 :type 'string
74 )
75
76(defcustom traceroute-program-options nil
77 "Options for the traceroute program."
78 :group 'net-utils
78dc50d3 79 :type '(repeat string)
e65f17fe
DN
80 )
81
82(defcustom ping-program "ping"
83 "Program to send network test packets to a host."
84 :group 'net-utils
85 :type 'string
86 )
87
88;; On Linux and Irix, the system's ping program seems to send packets
89;; indefinitely unless told otherwise
90(defcustom ping-program-options
91 (and (memq system-type (list 'linux 'gnu/linux 'irix))
92 (list "-c" "4"))
93 "Options for the ping program.
94These options can be used to limit how many ICMP packets are emitted."
95 :group 'net-utils
78dc50d3 96 :type '(repeat string)
e65f17fe
DN
97 )
98
99(defcustom ipconfig-program
100 (if (eq system-type 'windows-nt)
101 "ipconfig"
102 "ifconfig")
103 "Program to print network configuration information."
104 :group 'net-utils
105 :type 'string
106 )
107
108(defcustom ipconfig-program-options
109 (list
110 (if (eq system-type 'windows-nt)
111 "/all" "-a"))
112 "Options for ipconfig-program."
113 :group 'net-utils
78dc50d3 114 :type '(repeat string)
e65f17fe
DN
115 )
116
117(defcustom netstat-program "netstat"
118 "Program to print network statistics."
119 :group 'net-utils
120 :type 'string
121 )
122
3827b1b8
KH
123(defcustom netstat-program-options
124 (list "-a")
e65f17fe
DN
125 "Options for netstat-program."
126 :group 'net-utils
78dc50d3 127 :type '(repeat string)
e65f17fe
DN
128 )
129
130(defcustom arp-program "arp"
131 "Program to print IP to address translation tables."
132 :group 'net-utils
133 :type 'string
134 )
135
136(defcustom arp-program-options
137 (list "-a")
138 "Options for arp-program."
139 :group 'net-utils
78dc50d3 140 :type '(repeat string)
e65f17fe
DN
141 )
142
143(defcustom route-program
144 (if (eq system-type 'windows-nt)
145 "route"
146 "netstat")
147 "Program to print routing tables."
148 :group 'net-utils
149 :type 'string
150 )
151
152(defcustom route-program-options
153 (if (eq system-type 'windows-nt)
154 (list "print")
155 (list "-r"))
156 "Options for route-program."
157 :group 'net-utils
78dc50d3 158 :type '(repeat string)
e65f17fe
DN
159 )
160
161(defcustom nslookup-program "nslookup"
162 "Program to interactively query DNS information."
163 :group 'net-utils
164 :type 'string
165 )
166
167(defcustom nslookup-program-options nil
168 "List of options to pass to the nslookup program."
169 :group 'net-utils
78dc50d3 170 :type '(repeat string)
e65f17fe
DN
171 )
172
173(defcustom nslookup-prompt-regexp "^> "
174 "Regexp to match the nslookup prompt."
175 :group 'net-utils
176 :type 'regexp
177 )
178
179(defcustom ftp-program "ftp"
180 "Progam to run to do FTP transfers."
181 :group 'net-utils
182 :type 'string
183 )
184
185(defcustom ftp-program-options nil
186 "List of options to pass to the FTP program."
187 :group 'net-utils
78dc50d3 188 :type '(repeat string)
e65f17fe
DN
189 )
190
191(defcustom ftp-prompt-regexp "^ftp>"
192 "Regexp which matches the FTP program's prompt."
193 :group 'net-utils
194 :type 'regexp
195 )
196
197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
198;; Nslookup goodies
199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
200
201(defconst nslookup-font-lock-keywords
202 (and window-system
203 (progn
204 (require 'font-lock)
205 (list
206 (list nslookup-prompt-regexp 0 font-lock-reference-face)
207 (list "^[A-Za-z0-9 _]+:" 0 font-lock-type-face)
208 (list "\\<\\(SOA\\|NS\\|MX\\|A\\|CNAME\\)\\>"
209 1 font-lock-keyword-face)
210 ;; Dotted quads
211 (list
212 (mapconcat 'identity
213 (make-list 4 "[0-9]+")
214 "\\.")
215 0 font-lock-variable-name-face)
216 ;; Host names
217 (list
218 (let ((host-expression "[-A-Za-z0-9]+"))
219 (concat
220 (mapconcat 'identity
221 (make-list 2 host-expression)
222 "\\.")
223 "\\(\\." host-expression "\\)*")
224 )
225 0 font-lock-variable-name-face)
226 )))
227 "Expressions to font-lock for nslookup.")
228
229(defvar nslookup-abbrev-table (make-abbrev-table)
230 "Abbrev table for nslookup.")
231
232(define-abbrev nslookup-abbrev-table "e" "exit")
233(define-abbrev nslookup-abbrev-table "f" "finger")
234(define-abbrev nslookup-abbrev-table "h" "help")
235(define-abbrev nslookup-abbrev-table "lse" "lserver")
236(define-abbrev nslookup-abbrev-table "r" "root")
237(define-abbrev nslookup-abbrev-table "s" "set")
238(define-abbrev nslookup-abbrev-table "se" "server")
239(define-abbrev nslookup-abbrev-table "v" "viewer")
240
241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
242;; FTP goodies
243;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
244
245(defvar ftp-abbrev-table (make-abbrev-table)
246 "Abbrev table for ftp.")
247
248(define-abbrev ftp-abbrev-table "q" "quit")
249(define-abbrev ftp-abbrev-table "g" "get")
250(define-abbrev ftp-abbrev-table "p" "prompt")
251(define-abbrev ftp-abbrev-table "anon" "anonymous")
252
253(defconst ftp-font-lock-keywords
254 (and window-system
255 (progn
256 (require 'font-lock)
257 (list
258 (list ftp-prompt-regexp 0 font-lock-reference-face)))))
259
260
261;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
262;; Utility functions
263;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
264
380c917d
KH
265;; Simplified versions of some at-point functions from ffap.el.
266;; It's not worth loading all of ffap just for these.
267(defun net-utils-machine-at-point ()
268 (let ((pt (point)))
269 (buffer-substring-no-properties
270 (save-excursion
271 (skip-chars-backward "-a-zA-Z0-9.")
272 (point))
273 (save-excursion
274 (skip-chars-forward "-a-zA-Z0-9.")
275 (skip-chars-backward "." pt)
276 (point)))))
277
278(defun net-utils-url-at-point ()
279 (let ((pt (point)))
280 (buffer-substring-no-properties
281 (save-excursion
282 (skip-chars-backward "--:=&?$+@-Z_a-z~#,%")
283 (skip-chars-forward "^A-Za-z0-9" pt)
284 (point))
285 (save-excursion
286 (skip-chars-forward "--:=&?$+@-Z_a-z~#,%")
287 (skip-chars-backward ":;.,!?" pt)
288 (point)))))
289
290
e65f17fe
DN
291(defun net-utils-remove-ctrl-m-filter (process output-string)
292 "Remove trailing control Ms."
293 (let ((old-buffer (current-buffer))
294 (filtered-string output-string))
295 (unwind-protect
296 (let ((moving))
297 (set-buffer (process-buffer process))
298 (setq moving (= (point) (process-mark process)))
299
300 (while (string-match "\r" filtered-string)
301 (setq filtered-string
302 (replace-match "" nil nil filtered-string)))
303
304 (save-excursion
305 ;; Insert the text, moving the process-marker.
306 (goto-char (process-mark process))
307 (insert filtered-string)
308 (set-marker (process-mark process) (point)))
309 (if moving (goto-char (process-mark process))))
310 (set-buffer old-buffer))))
311
312(defmacro net-utils-run-program (name header program &rest args)
313 "Run a network information program."
314 (`
315 (let ((buf (get-buffer-create (concat "*" (, name) "*"))))
316 (set-buffer buf)
317 (erase-buffer)
318 (insert (, header) "\n")
319 (set-process-filter
320 (apply 'start-process (, name) buf (, program) (,@ args))
321 'net-utils-remove-ctrl-m-filter)
322 (display-buffer buf))))
323
324;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
325;; Wrappers for external network programs
326;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
327
328;;;###autoload
329(defun traceroute (target)
330 "Run traceroute program for TARGET."
331 (interactive "sTarget: ")
332 (let ((options
333 (if traceroute-program-options
334 (append traceroute-program-options (list target))
335 (list target))))
336 (net-utils-run-program
337 (concat "Traceroute" " " target)
338 (concat "** Traceroute ** " traceroute-program " ** " target)
339 traceroute-program
340 options
341 )))
342
343;;;###autoload
344(defun ping (host)
345 "Ping HOST.
346If your system's ping continues until interrupted, you can try setting
347`ping-program-options'."
348 (interactive
380c917d 349 (list (read-from-minibuffer "Ping host: " (net-utils-machine-at-point))))
e65f17fe
DN
350 (let ((options
351 (if ping-program-options
352 (append ping-program-options (list host))
353 (list host))))
354 (net-utils-run-program
355 (concat "Ping" " " host)
356 (concat "** Ping ** " ping-program " ** " host)
357 ping-program
358 options
359 )))
360
361;;;###autoload
362(defun ipconfig ()
363 "Run ipconfig program."
364 (interactive)
365 (net-utils-run-program
366 "Ipconfig"
367 (concat "** Ipconfig ** " ipconfig-program " ** ")
368 ipconfig-program
369 ipconfig-program-options
370 ))
371
372;; This is the normal name on most Unixes.
373;;;###autoload
374(defalias 'ifconfig 'ipconfig)
375
376;;;###autoload
377(defun netstat ()
378 "Run netstat program."
379 (interactive)
380 (net-utils-run-program
381 "Netstat"
382 (concat "** Netstat ** " netstat-program " ** ")
383 netstat-program
384 netstat-program-options
385 ))
386
387;;;###autoload
388(defun arp ()
389 "Run the arp program."
390 (interactive)
391 (net-utils-run-program
392 "Arp"
393 (concat "** Arp ** " arp-program " ** ")
394 arp-program
395 arp-program-options
396 ))
397
398;;;###autoload
399(defun route ()
400 "Run the route program."
401 (interactive)
402 (net-utils-run-program
403 "Route"
404 (concat "** Route ** " route-program " ** ")
405 route-program
406 route-program-options
407 ))
408
409;; FIXME -- Needs to be a process filter
410;; (defun netstat-with-filter (filter)
411;; "Run netstat program."
412;; (interactive "sFilter: ")
413;; (netstat)
414;; (set-buffer (get-buffer "*Netstat*"))
415;; (goto-char (point-min))
416;; (delete-matching-lines filter)
417;; )
418
419;;;###autoload
420(defun nslookup-host (host)
421 "Lookup the DNS information for HOST."
422 (interactive
380c917d 423 (list (read-from-minibuffer "Lookup host: " (net-utils-machine-at-point))))
e65f17fe
DN
424 (let ((options
425 (if nslookup-program-options
426 (append nslookup-program-options (list host))
427 (list host))))
428 (net-utils-run-program
429 "Nslookup"
430 (concat "** "
431 (mapconcat 'identity
432 (list "Nslookup" host nslookup-program)
433 " ** "))
434 nslookup-program
435 options
436 )))
437
438
439;;;###autoload
440(defun nslookup ()
441 "Run nslookup program."
442 (interactive)
c1977112 443 (require 'comint)
e65f17fe
DN
444 (comint-run nslookup-program)
445 (set-process-filter (get-buffer-process "*nslookup*")
446 'net-utils-remove-ctrl-m-filter)
447 (set
448 (make-local-variable 'font-lock-defaults)
449 '((nslookup-font-lock-keywords)))
450 (set
451 (make-local-variable 'local-abbrev-table)
452 nslookup-abbrev-table)
453 (abbrev-mode t)
454 (make-local-variable 'comint-prompt-regexp)
455 (setq comint-prompt-regexp nslookup-prompt-regexp)
456 )
457
458;; This is a lot less than ange-ftp, but much simpler.
459;;;###autoload
460(defun ftp (host)
461 "Run ftp program."
462 (interactive "sFtp to Host: ")
c1977112 463 (require 'comint)
e65f17fe
DN
464 (let ((buf (get-buffer-create (concat "*ftp [" host "]*"))))
465 (set-buffer buf)
466 (comint-mode)
467 (comint-exec buf (concat "ftp-" host) ftp-program nil
468 (if ftp-program-options
469 (append (list host) ftp-program-options)
470 (list host)))
471 (set
472 (make-local-variable 'font-lock-defaults)
473 '((ftp-font-lock-keywords)))
474
475 (make-local-variable 'comint-prompt-regexp)
476 (setq comint-prompt-regexp ftp-prompt-regexp)
477
478 ;; Already buffer local!
479 (setq comint-output-filter-functions
480 (list 'comint-watch-for-password-prompt))
481 (set
482 (make-local-variable 'local-abbrev-table)
483 ftp-abbrev-table)
484 (abbrev-mode t)
485 (switch-to-buffer-other-window buf)
486 ))
487
488;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
489;; Network Connections
490;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
491
492;; Full list is available at:
493;; ftp://ftp.isi.edu/in-notes/iana/assignments/port-numbers
494(defvar network-connection-service-alist
495 (list
496 (cons 'echo 7)
497 (cons 'active-users 11)
498 (cons 'daytime 13)
499 (cons 'chargen 19)
500 (cons 'ftp 21)
501 (cons 'telnet 23)
502 (cons 'smtp 25)
503 (cons 'time 37)
504 (cons 'whois 43)
505 (cons 'gopher 70)
506 (cons 'finger 79)
507 (cons 'www 80)
508 (cons 'pop2 109)
509 (cons 'pop3 110)
510 (cons 'sun-rpc 111)
511 (cons 'nntp 119)
512 (cons 'ntp 123)
513 (cons 'netbios-name 137)
514 (cons 'netbios-data 139)
515 (cons 'irc 194)
516 (cons 'https 443)
517 (cons 'rlogin 513)
518 )
519 "Alist of services and associated TCP port numbers.
520This list in not complete.")
521
522;; Workhorse macro
523(defmacro run-network-program (process-name host port
524 &optional initial-string)
525 (`
526 (let ((tcp-connection)
527 (buf)
528 )
529 (setq buf (get-buffer-create (concat "*" (, process-name) "*")))
530 (set-buffer buf)
531 (or
532 (setq tcp-connection
533 (open-network-stream
534 (, process-name)
535 buf
536 (, host)
537 (, port)
538 ))
539 (error "Could not open connection to %s" (, host)))
540 (erase-buffer)
541 (set-marker (process-mark tcp-connection) (point-min))
542 (set-process-filter tcp-connection 'net-utils-remove-ctrl-m-filter)
543 (and (, initial-string)
544 (process-send-string tcp-connection
545 (concat (, initial-string) "\r\n")))
546 (display-buffer buf))))
547
548;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
549;; Simple protocols
550;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
551
552;; Finger protocol
553;;;###autoload
554(defun finger (user host)
555 "Finger USER on HOST."
556 ;; One of those great interactive statements that's actually
557 ;; longer than the function call! The idea is that if the user
558 ;; uses a string like "pbreton@cs.umb.edu", we won't ask for the
559 ;; host name. If we don't see an "@", we'll prompt for the host.
560 (interactive
380c917d
KH
561 (let* ((answer (read-from-minibuffer "Finger User: "
562 (net-utils-url-at-point)))
563 (index (string-match (regexp-quote "@") answer)))
564 (if index
565 (list
566 (substring answer 0 index)
567 (substring answer (1+ index)))
568 (list
569 answer
570 (read-from-minibuffer "At Host: " (net-utils-machine-at-point))))))
e65f17fe
DN
571 (let* (
572 (user-and-host (concat user "@" host))
573 (process-name
574 (concat "Finger [" user-and-host "]"))
575 )
576 (run-network-program
577 process-name
578 host
579 (cdr (assoc 'finger network-connection-service-alist))
580 user-and-host
581 )))
582
c1977112
KH
583(defcustom whois-server-name "whois.arin.net"
584 "Default host name for the whois service."
e65f17fe
DN
585 :group 'net-utils
586 :type 'string
587 )
588
c1977112
KH
589(defcustom whois-server-list
590 '(("whois.arin.net") ; Networks, ASN's, and related POC's (numbers)
591 ("rs.internic.net") ; domain related info
592 ("whois.abuse.net")
593 ("whois.apnic.net")
594 ("nic.ddn.mil")
595 ("whois.nic.mil")
596 ("whois.nic.gov")
597 ("whois.ripe.net"))
598 "A list of whois servers that can be queried."
599 :group 'net-utils
62ef18ce 600 :type '(repeat (list string)))
c1977112
KH
601
602(defcustom whois-server-tld
603 '(("rs.internic.net" . "com")
604 ("rs.internic.net" . "org")
605 ("whois.ripe.net" . "be")
606 ("whois.ripe.net" . "de")
607 ("whois.ripe.net" . "dk")
608 ("whois.ripe.net" . "it")
609 ("whois.ripe.net" . "fi")
610 ("whois.ripe.net" . "fr")
611 ("whois.ripe.net" . "uk")
612 ("whois.apnic.net" . "au")
613 ("whois.apnic.net" . "ch")
614 ("whois.apnic.net" . "hk")
615 ("whois.apnic.net" . "jp")
616 ("whois.nic.gov" . "gov")
617 ("whois.nic.mil" . "mil"))
618 "Alist to map top level domains to whois servers."
619 :group 'net-utils
620 :type '(repeat (cons string string)))
621
622(defcustom whois-guess-server t
623 "If non-nil then whois will try to deduce the appropriate whois
624server from the query. If the query doesn't look like a domain or hostname
625then the server named by whois-server-name is used."
626 :group 'net-utils
627 :type 'boolean)
628
c1977112 629(defun whois-get-tld (host)
3d0ee5e6
RS
630 "Return the top level domain of `host', or nil if it isn't a domain name."
631 (let ((i (1- (length host)))
632 (max-len (- (length host) 5)))
633 (while (not (or (= i max-len) (char-equal (aref host i) ?.)))
634 (setq i (1- i)))
635 (if (= i max-len)
636 nil
637 (substring host (1+ i)))))
c1977112 638
e65f17fe
DN
639;; Whois protocol
640;;;###autoload
641(defun whois (arg search-string)
642 "Send SEARCH-STRING to server defined by the `whois-server-name' variable.
c1977112
KH
643If `whois-guess-server' is non-nil, then try to deduce the correct server
644from SEARCH-STRING. With argument, prompt for whois server."
e65f17fe 645 (interactive "P\nsWhois: ")
c1977112
KH
646 (let* ((whois-apropos-host (if whois-guess-server
647 (rassoc (whois-get-tld search-string)
648 whois-server-tld)
649 nil))
650 (server-name (if whois-apropos-host
651 (car whois-apropos-host)
652 whois-server-name))
653 (host
654 (if arg
655 (completing-read "Whois server name: "
656 whois-server-list nil nil "whois.")
657 server-name)))
e65f17fe
DN
658 (run-network-program
659 "Whois"
660 host
661 (cdr (assoc 'whois network-connection-service-alist))
662 search-string
663 )))
664
665(defcustom whois-reverse-lookup-server "whois.arin.net"
666 "Server which provides inverse DNS mapping."
667 :group 'net-utils
668 :type 'string
669 )
670
671;;;###autoload
672(defun whois-reverse-lookup ()
673 (interactive)
674 (let ((whois-server-name whois-reverse-lookup-server))
675 (call-interactively 'whois)))
676
677;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
678;;; General Network connection
679;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
680
681;;;###autoload
682(defun network-connection-to-service (host service)
683 "Open a network connection to SERVICE on HOST."
684 (interactive
685 (list
380c917d 686 (read-from-minibuffer "Host: " (net-utils-machine-at-point))
e65f17fe
DN
687 (completing-read "Service: "
688 (mapcar
689 (function
690 (lambda (elt)
691 (list (symbol-name (car elt)))))
692 network-connection-service-alist))))
693 (network-connection
694 host
695 (cdr (assoc (intern service) network-connection-service-alist)))
696 )
697
698;;;###autoload
699(defun network-connection (host port)
700 "Open a network connection to HOST on PORT."
701 (interactive "sHost: \nnPort: ")
702 (network-service-connection host (number-to-string port)))
703
704(defun network-service-connection (host service)
705 "Open a network connection to SERVICE on HOST."
c1977112 706 (require 'comint)
e65f17fe
DN
707 (let (
708 (process-name (concat "Network Connection [" host " " service "]"))
709 (portnum (string-to-number service))
710 )
711 (or (zerop portnum) (setq service portnum))
712 (make-comint
713 process-name
714 (cons host service))
715 (pop-to-buffer (get-buffer (concat "*" process-name "*")))
716 ))
717
718(provide 'net-utils)
719
720;;; net-utils.el ends here