Mercurial > hg > xemacs-beta
diff lisp/efs/efs-gwp.el @ 22:8fc7fe29b841 r19-15b94
Import from CVS: tag r19-15b94
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:50:29 +0200 |
parents | |
children | 8b8b7f3559a2 8619ce7e4c50 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/efs/efs-gwp.el Mon Aug 13 08:50:29 2007 +0200 @@ -0,0 +1,158 @@ +;; -*-Emacs-Lisp-*- +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; File: efs-gwp.el +;; Release: $efs release: 1.15 $ +;; Version: $Revision: 1.1 $ +;; RCS: +;; Description: Support for efs to use an interactive gateway. +;; Author: Andy Norman, Dawn +;; Created: Thu Mar 18 13:03:14 1993 +;; Modified: Sun Nov 27 18:31:50 1994 by sandy on gandalf +;; Language: Emacs-Lisp +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; This file is part of efs. See efs.el for copyright +;;; (it's copylefted) and warrranty (there isn't one) information. + +(provide 'efs-gwp) +(require 'efs) + +;;;; ------------------------------------------------------------ +;;;; Interactive gateway program support. +;;;; ------------------------------------------------------------ + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; User Variables and Documentation + +(defvar efs-gwp-setup-term-command + (if (eq system-type 'hpux) + "stty -onlcr -echo\n" + "stty -echo nl\n") + "Command to do terminal setup on the gateway machine. +They must stop the terminal echoing each command and strip out trailing +^M characters. This string must end in \\n. If you need to send multiple +commands, include them all in this string, separated by \\n. +See the documentation in efs.el for some example commands.") + +;; About efs-gwp-term-setup-command: +;; +;; It is important to get efs-gwp-setup-term-command right. +;; Here are some examples. Please tell us about which commands +;; to use on other platforms, so that we can include it in the +;; documentation. +;; +;; +;; HP-UX: +;; +;; "stty -onlcr -echo\n" +;; +;; SunOS: +;; +;; "stty -echo nl\n" +;; +;; VMS: (this should work) +;; +;; "set terminal/noecho\n" +;; + + +(defvar efs-gwp-prompt-pattern "^[^#$%>;]*[#$%>;] *" + "*Regexp used to detect that the gateway login sequence has completed. +It will be assumed that the shell is ready to receive input. Make this +regexp as strict as possible; it shouldn't match *anything* at all except +the shell's initial prompt. The above string will fail under most SUN-3's +since it matches the login banner.") + +;; About efs-gwp-prompt-pattern: +;; +;; It is very important that this not match anything in the machine's +;; login banner. +;; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;;; Internal Variables + +(defconst efs-gwp-version + (concat (substring "$efs release: 1.15 $" 14 -2) + "/" + (substring "$Revision: 1.1 $" 11 -2))) + +(defvar efs-gwp-running t) +(defvar efs-gwp-status nil) +(defvar efs-gwp-string "") + +;;; Entry point (defined as an autoload in efs.el) + +(defun efs-gwp-start (host user name) + "Login to the gateway machine and fire up an ftp process." + (message "Connecting to gateway %s..." efs-gateway-host) + (let ((proc (apply 'start-process name (efs-ftp-process-buffer host user) + (nth 1 efs-gateway-type) + (append (nth 2 efs-gateway-type) + (list efs-gateway-host)))) + (ftp (concat (nth 3 efs-gateway-type) " " + (mapconcat (function identity) (nth 4 efs-gateway-type) + " ") "\n"))) + (process-kill-without-query proc) + (set-process-sentinel proc (function efs-gwp-sentinel)) + (set-process-filter proc (function efs-gwp-filter)) + (set-marker (process-mark proc) (point)) + (setq efs-gwp-running t + efs-gwp-status nil + efs-gwp-string "") + (while efs-gwp-running ;perform login sequence + (accept-process-output proc)) + (if (not efs-gwp-status) + (efs-error host user "unable to login to gateway")) + (message "Connecting to gateway %s...done" efs-gateway-host) + (setq efs-gwp-running t + efs-gwp-status nil + efs-gwp-string "") + (process-send-string proc efs-gwp-setup-term-command) + (while efs-gwp-running ;zap ^M's and double echoing. + (accept-process-output proc)) + (if (not efs-gwp-status) + (efs-error host user "unable to set terminal modes on gateway")) + (setq efs-gwp-running t + efs-gwp-status nil + efs-gwp-string "") + (message "Opening FTP connection to %s..." host) + (process-send-string proc ftp) + proc)) + +;;; Process filter/sentinel + +(defun efs-gwp-sentinel (proc str) + (setq efs-gwp-running nil)) + +(defun efs-gwp-filter (proc str) + (efs-save-match-data + ;; Don't be sensitive to login vn LOGIN. + (let ((case-fold-search t)) + (efs-process-log-string proc str) + (setq efs-gwp-string (concat efs-gwp-string str)) + (cond ((string-match "\\(login\\|username\\): *$" efs-gwp-string) + (process-send-string proc + (concat + (let ((efs-default-user t)) + (efs-get-user efs-gateway-host)) + "\n"))) + ((string-match "password: *$" efs-gwp-string) + (process-send-string proc + (concat + (efs-get-passwd efs-gateway-host + (efs-get-user + efs-gateway-host)) + "\n"))) + ((string-match efs-gateway-fatal-msgs + efs-gwp-string) + (delete-process proc) + (setq efs-gwp-running nil)) + ((string-match efs-gwp-prompt-pattern + efs-gwp-string) + (setq efs-gwp-running nil + efs-gwp-status t)))))) + +;;; end of efs-gwp.el