annotate lisp/efs/efs.el @ 40:7e54bd776075 r19-15b103

Import from CVS: tag r19-15b103
author cvs
date Mon, 13 Aug 2007 08:54:25 +0200
parents 4103f0995bd7
children 8b8b7f3559a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1 ;; -*-Emacs-Lisp-*-
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4 ;; File: efs.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5 ;; Release: $efs release: 1.15 $
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 22
diff changeset
6 ;; Version: $Revision: 1.56 $
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7 ;; RCS:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8 ;; Description: Transparent FTP support for the original GNU Emacs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9 ;; from FSF and Lucid Emacs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10 ;; Authors: Andy Norman <ange@hplb.hpl.hp.com>,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
11 ;; Sandy Rutherford <sandy@ibm550.sissa.it>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
12 ;; Created: Thu Oct 12 14:00:05 1989 (as ange-ftp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
13 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
14 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
15
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
16 ;;; The following restrictions apply to all of the files in the efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
17 ;;; distribution.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
18 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
19 ;;; Copyright (C) 1993 Andy Norman / Sandy Rutherford
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
20 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
21 ;;; Authors:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
22 ;;; Andy Norman (ange@hplb.hpl.hp.com)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
23 ;;; Sandy Rutherford (sandy@ibm550.sissa.it)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
24 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
25 ;;; The authors of some of the sub-files of efs are different
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
26 ;;; from the above. We are very grateful to people who have
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
27 ;;; contributed code to efs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
28 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
29 ;;; This program is free software; you can redistribute it and/or modify
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
30 ;;; it under the terms of the GNU General Public License as published by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
31 ;;; the Free Software Foundation; either version 1, or (at your option)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
32 ;;; any later version.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
33 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
34 ;;; This program is distributed in the hope that it will be useful,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
35 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
36 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
37 ;;; GNU General Public License for more details.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
38 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
39 ;;; A copy of the GNU General Public License can be obtained from this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
40 ;;; program's authors (send electronic mail to ange@hplb.hpl.hp.com) or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
41 ;;; from the Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
42 ;;; MA 02139, USA.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
43
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
44 ;;; Description:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
45 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
46 ;;; This package attempts to make accessing files and directories on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
47 ;;; remote computers from within GNU Emacs as simple and transparent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
48 ;;; as possible. Currently all remote files are accessed using FTP.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
49 ;;; The goal is to make the entire internet accessible as a virtual
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
50 ;;; file system.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
51
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
52 ;;; Acknowledgements: << please add to this list >>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
53 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
54 ;;; Corny de Souza for writing efs-mpe.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
55 ;;; Jamie Zawinski for writing efs-ti-twenex.el and efs-ti-explorer.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
56 ;;; Joe Wells for writing the first pass at vms support for ange-ftp.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
57 ;;; Sebastian Kremer for helping with dired support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
58 ;;; Ishikawa Ichiro for MULE support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
59 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
60 ;;; Many other people have contributed code, advice, and beta testing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
61 ;;; (sometimes without even realizing it) to both ange-ftp and efs:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
62 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
63 ;;; Rob Austein, Doug Bagley, Andy Caiger, Jim Franklin, Noah
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
64 ;;; Friedman, Aksnes Knut-Havard, Elmar Heeb, John Interrante, Roland
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
65 ;;; McGrath, Jeff Morgenthaler, Mike Northam, Jens Petersen, Jack
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
66 ;;; Repenning, Joerg-Martin Schwarz, Michael Sperber, Svein Tjemsland,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
67 ;;; Andy Whitcroft, Raymond A. Wiker
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
68 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
69 ;;; Also, thank you to all the people on the efs-testers mailing list.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
70 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
71
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
72 ;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
73 ;;; Documentation:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
74 ;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
75 ;;;
40
7e54bd776075 Import from CVS: tag r19-15b103
cvs
parents: 24
diff changeset
76 ;;; If you have any problems with efs, please read this section
7e54bd776075 Import from CVS: tag r19-15b103
cvs
parents: 24
diff changeset
77 ;;; *before* submitting a bug report.
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
78
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
79 ;;; Installation:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
80 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
81 ;;; For byte compiling the efs package, a Makefile is provided.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
82 ;;; You should follow the instructions at the top of the Makefile.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
83 ;;; If you have any problems, please let us know so that we can fix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
84 ;;; them for other users. Don't even consider using efs without
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
85 ;;; byte compiling it. It will be far too slow.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
86 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
87 ;;; If you decide to byte compile efs by hand, it is important that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
88 ;;; the file efs-defun.el be byte compiled first, followed by efs.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
89 ;;; The other files may be byte compiled in any order.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
90 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
91 ;;; To use efs, simply put the byte compiled files in your load path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
92 ;;; and add
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
93 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
94 ;;; (require 'efs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
95 ;;;
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 22
diff changeset
96 ;;; in your .emacs file. Note this takes awhile, and some users have
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 22
diff changeset
97 ;;; found this to be unbearably slow. Therefore ...
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
98 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
99 ;;; If you would like efs to be autoloaded when you attempt to access
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
100 ;;; a remote file, put
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
101 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
102 ;;; (require 'efs-auto)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
103 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
104 ;;; in your .emacs file. Note that there are some limitations associated
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
105 ;;; with autoloading efs. A discussion of them is given at the top of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
106 ;;; efs-auto.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
107
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
108 ;;; Configuration variables:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
109 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
110 ;;; It is important that you read through the section on user customization
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
111 ;;; variables (search forward for the string ">>>"). If your local network
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
112 ;;; is not fully connected to the internet, but accesses the internet only
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
113 ;;; via a gateway, then it is vital to set the appropriate variables to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
114 ;;; inform efs about the geometry of your local network. Also, see the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
115 ;;; paragraph on gateways below.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
116
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
117 ;;; Usage:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
118 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
119 ;;; Once installed, efs operates largely transparently. All files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
120 ;;; normally accessible to you on the internet, become part of a large
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
121 ;;; virtual file system. These files are accessed using an extended
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
122 ;;; file name syntax. To access file <path> on remote host <host> by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
123 ;;; logging in as user <user>, you simply specify the full path of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
124 ;;; file as /<user>@<host>:<path>. Nearly all GNU Emacs file handling
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
125 ;;; functions work for remote files. It is not possible to access
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
126 ;;; remote files using shell commands in an emacs *shell* buffer, as such
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
127 ;;; commands are passed directly to the shell, and not handled by emacs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
128 ;;; FTP is the underlying utility that efs uses to operate on remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
129 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
130 ;;; For example, if find-file is given a filename of:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
131 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
132 ;;; /ange@anorman:/tmp/notes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
133 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
134 ;;; then efs will spawn an FTP process, connect to the host 'anorman' as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
135 ;;; user 'ange', get the file '/tmp/notes' and pop up a buffer containing the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
136 ;;; contents of that file as if it were on the local file system. If efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
137 ;;; needed a password to connect then it would prompt the user in the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
138 ;;; minibuffer. For further discussion of the efs path syntax, see the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
139 ;;; paragraph on extended file name syntax below.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
140
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
141 ;;; Ports:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
142 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
143 ;;; efs supports the use of nonstandard ports on remote hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
144 ;;; To specify that port <port> should be used, give the host name as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
145 ;;; host#<port>. Host names may be given in this form anywhere that efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
146 ;;; normally expects a host name. This includes in the .netrc file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
147 ;;; Logically, efs treats different ports to correspond to different
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
148 ;;; remote hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
149
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
150 ;;; Extended filename syntax:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
151 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
152 ;;; The default full efs path syntax is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
153 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
154 ;;; /<user>@<host>#<port>:<path>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
155 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
156 ;;; Both the `#<port>' and `<user>@' may be omitted.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
157 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
158 ;;; If the `#<port>' is omitted, then the default port is taken to be 21,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
159 ;;; the usual FTP port. For most users, the port syntax will only
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
160 ;;; very rarely be necessary.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
161 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
162 ;;; If the `<user>@' is omitted, then efs will use a default user. If a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
163 ;;; login token is specified in your .netrc file, then this will be used as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
164 ;;; the default user for <host>. Otherwise, it is determined based on the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
165 ;;; value of the variable efs-default-user.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
166 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
167 ;;; This efs path syntax can be customised to a certain extent by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
168 ;;; changing a number of variables in the subsection Internal Variables.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
169 ;;; To undertake such a customization requires some knowledge about the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
170 ;;; internal workings of efs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
171
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
172 ;;; Passwords:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
173 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
174 ;;; A password is required for each host / user pair. This will be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
175 ;;; prompted for when needed, unless already set by calling
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
176 ;;; efs-set-passwd, or specified in a *valid* ~/.netrc file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
177 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
178 ;;; When efs prompts for a password, it provides defaults from its
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
179 ;;; cache of currently known passwords. The defaults are ordered such
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
180 ;;; that passwords for accounts which have the same user name as the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
181 ;;; login which is currently underway have priority. You can cycle
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
182 ;;; through your list of defaults with C-n to cycle forwards and C-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
183 ;;; to cycle backwards. The list is circular.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
184
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
185 ;;; Passwords for user "anonymous":
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
186 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
187 ;;; Passwords for the user "anonymous" (or "ftp") are handled
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
188 ;;; specially. The variable efs-generate-anonymous-password controls
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
189 ;;; what happens. If the value of this variable is a string, then this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
190 ;;; is used as the password; if non-nil, then a password is created
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
191 ;;; from the name of the user and the hostname of the machine on which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
192 ;;; GNU Emacs is running; if nil (the default) then the user is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
193 ;;; prompted for a password as normal.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
194
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
195 ;;; "Dumb" UNIX hosts:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
196 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
197 ;;; The FTP servers on some UNIX machines have problems if the "ls"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
198 ;;; command is used. efs will try to correct for this automatically,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
199 ;;; and send the "dir" command instead. If it fails, you can call the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
200 ;;; function efs-add-host, and give the host type as dumb-unix. Note
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
201 ;;; that this change will take effect for the current GNU Emacs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
202 ;;; session only. To make this specification for future emacs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
203 ;;; sessions, put
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
204 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
205 ;;; (efs-add-host 'dumb-unix "hostname")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
206 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
207 ;;; in your .emacs file. Also, please report any failure to automatically
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
208 ;;; recognize dumb unix to the "bugs" address given below, so that we can
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
209 ;;; fix the auto recognition code.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
210
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
211 ;;; File name completion:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
212 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
213 ;;; Full file-name completion is supported on every type of remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
214 ;;; host. To do filename completion, efs needs a listing from the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
215 ;;; remote host. Therefore, for very slow connections, it might not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
216 ;;; save any time. However, the listing is cached, so subsequent uses
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
217 ;;; of file-name completion will be just as fast as for local file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
218 ;;; names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
219
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
220 ;;; FTP processes:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
221 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
222 ;;; When efs starts up an FTP process, it leaves it running for speed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
223 ;;; purposes. Some FTP servers will close the connection after a period of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
224 ;;; time, but efs should be able to quietly reconnect the next time that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
225 ;;; the process is needed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
226 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
227 ;;; The FTP process will be killed should the associated "*ftp user@host*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
228 ;;; buffer be deleted. This should not cause efs any grief.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
229
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
230 ;;; Showing background FTP activity on the mode-line:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
231 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
232 ;;; After efs is loaded, the command efs-display-ftp-activity will cause
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
233 ;;; background FTP activity to be displayed on the mode line. The variable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
234 ;;; efs-mode-line-format is used to determine how this data is displayed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
235 ;;; efs does not continuously track the number of active sessions, as this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
236 ;;; would cause the display to change too rapidly. Rather, it uses a heuristic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
237 ;;; algorithm to determine when there is a significant change in FTP activity.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
238
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
239 ;;; File types:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
240 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
241 ;;; By default efs will assume that all files are ASCII. If a file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
242 ;;; being transferred matches the value of efs-binary-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
243 ;;; then the file will be assumed to be a binary file, and efs will
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
244 ;;; transfer it using "type image". ASCII files will be transferred
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
245 ;;; using a transfer type which efs computes to be correct according
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
246 ;;; to its knowledge of the file system of the remote host. The
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
247 ;;; command `efs-prompt-for-transfer-type' toggles the variable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
248 ;;; `efs-prompt-for-transfer-type'. When this variable is non-nil, efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
249 ;;; will prompt the user for the transfer type to use for every FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
250 ;;; transfer. Having this set all the time is annoying, but it is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
251 ;;; useful to give special treatment to a small set of files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
252 ;;; There is also variable efs-text-file-name-regexp. This is tested before
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
253 ;;; efs-binary-file-name-regexp, so if you set efs-text-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
254 ;;; to a non-trivial regular expression, and efs-binary-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
255 ;;; to ".*", the result will to make image the default tranfer type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
256 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
257 ;;; Also, if you set efs-treat-crlf-as-nl, then efs will use type image
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
258 ;;; to transfer files between hosts whose file system differ only in that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
259 ;;; one specifies end of line as CR-LF, and the other as NL. This is useful
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
260 ;;; if you are transferring files between UNIX and DOS machines, and have a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
261 ;;; package such as dos-mode.el, that handles the extra ^M's.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
262
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
263 ;;; Account passwords:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
264 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
265 ;;; Some FTP servers require an additional password which is sent by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
266 ;;; the ACCOUNT command. efs will detect this and prompt the user for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
267 ;;; an account password if the server expects one. Also, an account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
268 ;;; password can be set by calling efs-set-account, or by specifying
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
269 ;;; an account token in the .netrc file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
270 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
271 ;;; Some operating systems, such as CMS, require that ACCOUNT be used to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
272 ;;; give a write access password for minidisks. efs-set-account can be used
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
273 ;;; to set a write password for a specific minidisk. Also, tokens of the form
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
274 ;;; minidisk <minidisk name> <password>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
275 ;;; may be added to host lines in your .netrc file. Minidisk tokens must be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
276 ;;; at the end of the host line, however there may be an arbitrary number of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
277 ;;; them for any given host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
278
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
279 ;;; Preloading:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
280 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
281 ;;; efs can be preloaded, but must be put in the site-init.el file and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
282 ;;; not the site-load.el file in order for the documentation strings for the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
283 ;;; functions being overloaded to be available.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
284
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
285 ;;; Status reports:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
286 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
287 ;;; Most efs commands that talk to the FTP process output a status
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
288 ;;; message on what they are doing. In addition, efs can take advantage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
289 ;;; of the FTP client's HASH command to display the status of transferring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
290 ;;; files and listing directories. See the documentation for the variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
291 ;;; efs-hash-mark-size, efs-send-hash and efs-verbose for more details.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
292
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
293 ;;; Caching of directory information:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
294 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
295 ;;; efs keeps an internal cache of file listings from remote hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
296 ;;; If this cache gets out of synch, it can be renewed by reverting a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
297 ;;; dired buffer for the appropriate directory (dired-revert is usually
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
298 ;;; bound to "g").
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
299 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
300 ;;; Alternatively, you can add the following two lines to your .emacs file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
301 ;;; if you want C-r to refresh efs's cache whilst doing filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
302 ;;; completion.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
303 ;;; (define-key minibuffer-local-completion-map "\C-r" 'efs-re-read-dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
304 ;;; (define-key minibuffer-local-must-match-map "\C-r" 'efs-re-read-dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
305
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
306 ;;; Gateways:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
307 ;;;
40
7e54bd776075 Import from CVS: tag r19-15b103
cvs
parents: 24
diff changeset
308 ;;; Sometimes it is necessary for the FTP process to be run on a different
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
309 ;;; machine than the machine running GNU Emacs. This can happen when the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
310 ;;; local machine has restrictions on what hosts it can access.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
311 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
312 ;;; efs has support for running the ftp process on a different (gateway)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
313 ;;; machine. The way it works is as follows:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
314 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
315 ;;; 1) Set the variable 'efs-gateway-host' to the name of a machine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
316 ;;; that doesn't have the access restrictions. If you need to use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
317 ;;; a nonstandard port to access this host for gateway use, then
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
318 ;;; specify efs-gateway-host as "<hostname>#<port>".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
319 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
320 ;;; 2) Set the variable 'efs-ftp-local-host-regexp' to a regular expression
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
321 ;;; that matches hosts that can be contacted from running a local ftp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
322 ;;; process, but fails to match hosts that can't be accessed locally. For
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
323 ;;; example:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
324 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
325 ;;; "\\.hp\\.com$\\|^[^.]*$"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
326 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
327 ;;; will match all hosts that are in the .hp.com domain, or don't have an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
328 ;;; explicit domain in their name, but will fail to match hosts with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
329 ;;; explicit domains or that are specified by their ip address.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
330 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
331 ;;; 3) Set the variable `efs-local-host-regexp' to machines that you have
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
332 ;;; direct TCP/IP access. In other words, you must be able to ping these
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
333 ;;; hosts. Usually, efs-ftp-local-host-regexp and efs-local-host-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
334 ;;; will be the same. However, they will differ for so-called transparent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
335 ;;; gateways. See #7 below for more details.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
336 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
337 ;;; 4) Set the variable 'efs-gateway-tmp-name-template' to the name of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
338 ;;; a directory plus an identifying filename prefix for making temporary
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
339 ;;; files on the gateway. For example: "/tmp/hplose/ange/efs"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
340 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
341 ;;; 5) If the gateway and the local host share cross-mounted directories,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
342 ;;; set the value of `efs-gateway-mounted-dirs-alist' accordingly. It
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
343 ;;; is particularly useful, but not mandatory, that the directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
344 ;;; of `efs-gateway-tmp-name-template' be cross-mounted.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
345 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
346 ;;; 6) Set the variable `efs-gateway-type' to the type gateway that you have.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
347 ;;; This variable is a list, the first element of which is a symbol
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
348 ;;; denoting the type of gateway. Following elements give further
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
349 ;;; data on the gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
350 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
351 ;;; Supported gateway types:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
352 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
353 ;;; a) local:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
354 ;;; This means that your local host is itself the gateway. However,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
355 ;;; it is necessary to use a different FTP client to gain access to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
356 ;;; the outside world. If the name of the FTP client were xftp, you might
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
357 ;;; set efs-gateway-type to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
358 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
359 ;;; (list 'local "xftp" efs-ftp-program-args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
360 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
361 ;;; If xftp required special arguments, then give them in place of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
362 ;;; efs-ftp-program-args. See the documentation for efs-ftp-program-args
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
363 ;;; for the syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
364 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
365 ;;; b) proxy:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
366 ;;; This indicates that your gateway works by first FTP'ing to it, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
367 ;;; then issuing a USER command of the form
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
368 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
369 ;;; USER <username>@<host>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
370 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
371 ;;; In this case, you might set efs-gateway-type to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
372 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
373 ;;; (list 'proxy "ftp" efs-ftp-program-args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
374 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
375 ;;; If you need to use a nonstandard client, such as iftp, give this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
376 ;;; instead of "ftp". If this client needs to take special arguments,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
377 ;;; give them instead of efs-ftp-program-args.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
378 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
379 ;;; c) remsh:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
380 ;;; For this type of gateway, you need to start a remote shell on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
381 ;;; your gateway, using either remsh or rsh. You should set
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
382 ;;; efs-gateway-type to something like
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
383 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
384 ;;; (list 'remsh "remsh" nil "ftp" efs-ftp-program-args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
385 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
386 ;;; If you use rsh instead of remsh, change the second element from
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
387 ;;; "remsh" to "rsh". Note that the symbol indicating the gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
388 ;;; type should still be 'remsh. If you want to pass arguments
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
389 ;;; to the remsh program, give them as the third element. For example,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
390 ;;; if you need to specify a user, make this (list "-l" "sandy").
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
391 ;;; If you need to use a nonstandard FTP client, specify that as the fourth
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
392 ;;; element. If your FTP client needs to be given special arguments,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
393 ;;; give them instead of efs-ftp-program-args.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
394 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
395 ;;; d) interactive:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
396 ;;; This indicates that you need to establish a login on the gateway,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
397 ;;; using either telnet or rlogin.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
398 ;;; You should set efs-gateway-type to something like
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
399 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
400 ;;; (list 'interactive "rlogin" nil "exec ftp" efs-ftp-program-args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
401 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
402 ;;; If you need to use telnet, then give "telnet" in place of the second
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
403 ;;; element "rlogin". If your login program needs to be given arguments,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
404 ;;; then they should be given in the third slot. The fourth element
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
405 ;;; is for the name of the FTP client program. Giving this as "exec ftp",
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
406 ;;; instead of "ftp", ensures that you are logged out if the FTP client
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
407 ;;; dies. If the FTP client takes special arguments, give these instead
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
408 ;;; of efs-ftp-program-args. Furthermore, you should see the documentation
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
409 ;;; at the top of efs-gwp.el. You may need to set the variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
410 ;;; efs-gwp-setup-term-command, and efs-gwp-prompt-pattern.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
411 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
412 ;;; e) raptor:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
413 ;;; This is a type of gateway where efs is expected to specify a gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
414 ;;; user, and send a password for this user using the ACCOUNT command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
415 ;;; For example, to log in to foobar.edu as sandy, while using the account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
416 ;;; ange on the gateway, the following commands would be sent:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
417 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
418 ;;; open raptorgate.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
419 ;;; quote USER sandy@foobar.edu ange
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
420 ;;; quote pass <sandy's password on foobar>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
421 ;;; quote account <ange's password on raptorgate>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
422 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
423 ;;; For such a gateway, you would set efs-gateway-type to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
424 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
425 ;;; (list 'raptor efs-ftp-program efs-ftp-program-args <GATEWAY USER>)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
426 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
427 ;;; where <GATEWAY USER> is the name of your account on the gateway. In
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
428 ;;; the above example, this would be "ange". You can set your gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
429 ;;; password by simply setting an account password for the gateway host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
430 ;;; This can be done with either efs-set-account, or within your .netrc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
431 ;;; file. If no password is set, you will be prompted for one.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
432 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
433 ;;; f) interlock:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
434 ;;; This is a type of gateway where you are expected to send a PASS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
435 ;;; command after opening the connection to the gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
436 ;;; The precise login sequence is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
437 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
438 ;;; open interlockgate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
439 ;;; quote PASS <sandy's password on interlockgate>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
440 ;;; quote USER sandy@foobar.edu
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
441 ;;; quote PASS <sandy's password on foobar.edu>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
442 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
443 ;;; For such a gateway, you should set efs-gateway-type to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
444 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
445 ;;; (list 'interlock efs-ftp-program efs-ftp-program-args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
446 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
447 ;;; If you need to use a nonstandard name for your FTP client,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
448 ;;; then replace efs-ftp-program with this name. If your FTP client
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
449 ;;; needs to take nonstandard arguments, then replace efs-ftp-program-args
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
450 ;;; with these arguments. See efs-ftp-program-args <V> for the required
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
451 ;;; syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
452 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
453 ;;; If your gateway returns both a 220 code and a 331 code to the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
454 ;;; "open interlockgate" command, then you should add a regular
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
455 ;;; expression to efs-skip-msgs <V> that matches the 220 response.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
456 ;;; Returning two response codes to a single FTP command is not permitted
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
457 ;;; in RFC 959. It is not possible for efs to ignore the 220 by default,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
458 ;;; because than it would hang for interlock installations which do not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
459 ;;; require a password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
460 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
461 ;;; g) kerberos:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
462 ;;; With this gateway, you need to authenticate yourself by getting a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
463 ;;; kerberos "ticket" first. Usually, this is done with the kinit program.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
464 ;;; Once authenticated, you connect to foobar.com as user sandy with the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
465 ;;; sequence: (Note that the "-n" argument inhibits automatic login.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
466 ;;; Although, in manual use you probably don't use it, efs always uses it.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
467 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
468 ;;; iftp -n
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
469 ;;; open foobar.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
470 ;;; user sandy@foobar.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
471 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
472 ;;; You should set efs-gateway-type to something like
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
473 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
474 ;;; (list 'kerberos "iftp" efs-ftp-program-args "kinit" <KINIT-ARGS>)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
475 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
476 ;;; If you use an FTP client other than iftp, insert its name instead
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
477 ;;; of "iftp" above. If your FTP client needs special arguments, give
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
478 ;;; them as a list of strings in place of efs-ftp-program-args. If
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
479 ;;; the program that you use to collect a ticket in not called "kinit",
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
480 ;;; then give its name in place of "kinit" above. <KINIT-ARGS> should be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
481 ;;; any arguments that you need to pass to your kinit program, given as a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
482 ;;; list of strings. Most likely, you will give this as nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
483 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
484 ;;; See the file efs-kerberos.el for more configuration variables. If you
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
485 ;;; need to adjust any of these variables, please report this to us so that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
486 ;;; we can fix them for other users.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
487 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
488 ;;; If efs detects that you are not authenticated to use the gateway, it
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
489 ;;; will run the kinit program automatically, prompting you for a password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
490 ;;; If you give a password in your .netrc file for login the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
491 ;;; efs-gateway-host <V> and user kerberos, then efs will use this to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
492 ;;; obtain gateway authentication.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
493 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
494 ;;; 7) Transparent gateways:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
495 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
496 ;;; If your gateway is completely transparent (for example it uses
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
497 ;;; socks), then you should set efs-gateway-type to nil. Also,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
498 ;;; set efs-ftp-local-host-regexp to ".*". However, efs-local-host-regexp,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
499 ;;; must still be set to a regular expression matching hosts in your local
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
500 ;;; domain. efs uses this to determine which machines that it can
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
501 ;;; open-network-stream to. Furthermore, you should still set
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
502 ;;; efs-gateway-host to the name of your gateway machine. That way efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
503 ;;; will know that this is a special machine having direct TCP/IP access
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
504 ;;; to both hosts in the outside world, and hosts in your local domain.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
505 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
506 ;;; 8) Common Problems with Gateways:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
507 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
508 ;;; a) Spurious 220 responses:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
509 ;;; Some proxy-style gateways (eg gateway type 'proxy or 'raptor),
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
510 ;;; return two 3-digit FTP reply codes to the USER command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
511 ;;; For example:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
512 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
513 ;;; open gateway.weird
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
514 ;;; 220 Connected to gateway.weird
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
515 ;;; quote USER sandy@foobar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
516 ;;; 220 Connected to foobar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
517 ;;; 331 Password required for sandy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
518 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
519 ;;; This is wrong, according to the FT Protocol. Each command must return
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
520 ;;; exactly one 3-digit reply code. It may be preceded by continuation
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
521 ;;; lines. What should really be returned is:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
522 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
523 ;;; quote USER sandy@foobar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
524 ;;; 331-Connected to foobar.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
525 ;;; 331 Password required for sandy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
526 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
527 ;;; or even
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
528 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
529 ;;; quote USER sandy@foobar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
530 ;;; 331-220 Connected to foobar.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
531 ;;; 331 Password required for sandy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
532 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
533 ;;; Even though the "331-220" looks strange, it is correct protocol, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
534 ;;; efs will parse it properly.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
535 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
536 ;;; If your gateway is returning a spurious 220 to USER, a work-around
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
537 ;;; is to add a regular expression to `efs-skip-msgs' that matches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
538 ;;; this line. It must not match the 220 line returned to the open
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
539 ;;; command. This work-around may not work, as some system FTP clients
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
540 ;;; also get confused by the spurious 220. In this case, the only
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
541 ;;; solution is to patch the gateway server. In either case, please
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
542 ;;; send a bug report to the author of your gateway software.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
543 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
544 ;;; b) Case-sensitive parsing of FTP commands:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
545 ;;; Some gateway servers seem to treat FTP commands case-sensitively.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
546 ;;; This is incorrect, as RFC 959 clearly states that FTP commands
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
547 ;;; are always to be case-insensitive. If this is a problem with your
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
548 ;;; gateway server, you should send a bug report to its author.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
549 ;;; If efs is using a case for FTP commands that does not suit your server,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
550 ;;; a possible work-around is to edit the efs source so that the required
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
551 ;;; case is used. However, we will not be making any changes to the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
552 ;;; standard efs distribution to support this type of server behaviour.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
553 ;;; If you need help changing the efs source, you should enquire with the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
554 ;;; efs-help mailing list.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
555 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
556
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
557 ;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
558 ;;; Tips for using efs:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
559 ;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
560
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
561 ;;; 1) Beware of compressing files on non-UNIX hosts. efs will do it by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
562 ;;; copying the file to the local machine, compressing it there, and then
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
563 ;;; sending it back. Binary file transfers between machines of different
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
564 ;;; architectures can be a risky business. Test things out first on some
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
565 ;;; test files. See "Bugs" below. Also, note that efs sometimes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
566 ;;; copies files by moving them through the local machine. Again,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
567 ;;; be careful when doing this with binary files on non-Unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
568 ;;; machines.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
569 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
570 ;;; 2) Beware that dired over ftp will use your setting of dired-no-confirm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
571 ;;; (list of dired commands for which confirmation is not asked).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
572 ;;; You might want to reconsider your setting of this variable,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
573 ;;; because you might want confirmation for more commands on remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
574 ;;; direds than on local direds. For example, I strongly recommend
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
575 ;;; that you not include compress in this list. If there is enough
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
576 ;;; demand it might be a good idea to have an alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
577 ;;; efs-dired-no-confirm of pairs ( TYPE . LIST ), where TYPE is an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
578 ;;; operating system type and LIST is a list of commands for which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
579 ;;; confirmation would be suppressed. Then remote dired listings
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
580 ;;; would take their (buffer-local) value of dired-no-confirm from
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
581 ;;; this alist. Who votes for this?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
582 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
583 ;;; 3) Some combinations of FTP clients and servers break and get out of sync
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
584 ;;; when asked to list a non-existent directory. Some of the ai.mit.edu
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
585 ;;; machines cause this problem for some FTP clients. Using
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
586 ;;; efs-kill-ftp-process can be used to restart the ftp process, which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
587 ;;; should get things back in synch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
588 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
589 ;;; 4) Some ftp servers impose a length limit on the password that can
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
590 ;;; be sent. If this limit is exceeded they may bomb in an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
591 ;;; incomprehensible way. This sort of behaviour is common with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
592 ;;; MVS servers. Therefore, you should beware of this possibility
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
593 ;;; if you are generating a long password (like an email address)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
594 ;;; with efs-generate-anonymous-password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
595 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
596 ;;; 5) Some antiquated FTP servers hang when asked for an RNFR command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
597 ;;; efs sometimes uses this to test whether its local cache is stale.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
598 ;;; If your server for HOST hangs when asked for this command, put
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
599 ;;; (efs-set-host-property HOST 'rnfr-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
600 ;;; in your efs-ftp-startup-function-alist entry for HOST.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
601 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
602
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
603 ;;; -----------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
604 ;;; Where to get the latest version of efs:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
605 ;;; -----------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
606 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
607 ;;; The authors are grateful to anyone or any organization which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
608 ;;; provides anonymous FTP distribution for efs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
609 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
610 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
611 ;;; Europe:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
612 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
613 ;;; Switzerland
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
614 ;;; /anonymous@itp.ethz.ch:/sandy/efs/
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
615 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
616 ;;; North America:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
617 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
618 ;;; Massachusetts, USA
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
619 ;;; /anonymous@alpha.gnu.ai.mit.edu:/efs/
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
620 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
621 ;;; California, USA
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
622 ;;; /anonymous@ftp.hmc.edu:/pub/emacs/packages/efs/
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
623 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
624 ;;; Australia and New Zealand:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
625 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
626 ;;; ????????????
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
627 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
628 ;;; Japan:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
629 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
630 ;;; ????????????
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
631
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
632 ;;; ---------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
633 ;;; Non-UNIX support:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
634 ;;; ---------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
635
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
636 ;;; efs has full support, incuding file name completion and tree dired
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
637 ;;; for:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
638 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
639 ;;; VMS, CMS, MTS, MVS, ti-twenex, ti-explorer (the last two are lisp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
640 ;;; machines), TOPS-20, DOS (running the Distinct, Novell, FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
641 ;;; software, NCSA, Microsoft in both unix and DOS mode, Super TCP, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
642 ;;; Hellsoft FTP servers), unix descriptive listings (dl), KA9Q, OS/2,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
643 ;;; VOS, NOS/VE, CMS running the KNET server, Tandem's Guardian OS, COKE
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
644 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
645 ;;; efs should be able to automatically recognize any of the operating
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
646 ;;; systems and FTP servers that it supports. Please report any
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
647 ;;; failure to do so to the "bugs" address below. You can specify a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
648 ;;; certain host as being of a given host type with the command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
649 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
650 ;;; (efs-add-host <host-type> <host>)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
651 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
652 ;;; <host-type> is a symbol, <host> is a string. If this command is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
653 ;;; used interactively, then <host-type> is prompted for with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
654 ;;; completion. Some host types have regexps that can be used to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
655 ;;; specify a class of host names as being of a certain type. Note
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
656 ;;; that if you specify a host as being of a certain type, efs does
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
657 ;;; not verify that that is really the type of the host. This calls
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
658 ;;; for caution when using regexps to specify host types, as an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
659 ;;; inadvertent match to a regexp might have unpleasant consequences.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
660 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
661 ;;; See the respective efs-TYPE.el files for more information.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
662 ;;; When or if we get a tex info file, it should contain some more
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
663 ;;; details on the non-unix support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
664
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
665 ;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
666 ;;; Bugs and other things that go clunk in the night:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
667 ;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
668
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
669 ;;; How to report a bug:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
670 ;;; --------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
671 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
672 ;;; Type M-x efs-report-bug
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
673 ;;; or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
674 ;;; send mail to efs-bugs@cuckoo.hpl.hp.com.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
675 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
676 ;;; efs is a "free" program. This means that you didn't (or shouldn't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
677 ;;; have) paid anything for it. It also means that nobody is paid to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
678 ;;; maintain it, and the authors weren't paid for writing it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
679 ;;; Therefore, please try to write your bug report in a clear and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
680 ;;; complete fashion. It will greatly enhance the probability that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
681 ;;; something will be done about your problem.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
682 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
683 ;;; Note that efs relies heavily in cached information, so the bug may
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
684 ;;; depend in a complicated fashion on commands that were performed on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
685 ;;; remote files from the beginning of your emacs session. Trying to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
686 ;;; reproduce your bug starting from a fresh emacs session is usually
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
687 ;;; a good idea.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
688 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
689
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
690 ;;; Fan/hate mail:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
691 ;;; --------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
692 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
693 ;;; efs has its own mailing list called efs-help. All users of efs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
694 ;;; are welcome to subscribe (see below) and to discuss aspects of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
695 ;;; efs. New versions of efs are posted periodically to the mailing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
696 ;;; list.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
697 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
698 ;;; To [un]subscribe to efs-help, or to report mailer problems with the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
699 ;;; list, please mail one of the following addresses:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
700 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
701 ;;; efs-help-request@cuckoo.hpl.hp.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
702 ;;; or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
703 ;;; efs-help-request%cuckoo.hpl.hp.com@hplb.hpl.hp.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
704 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
705 ;;; Please don't forget the -request part.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
706 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
707 ;;; For mail to be posted directly to efs-help, send to one of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
708 ;;; following addresses:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
709 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
710 ;;; efs-help@cuckoo.hpl.hp.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
711 ;;; or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
712 ;;; efs-help%cuckoo.hpl.hp.com@hplb.hpl.hp.com
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
713 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
714 ;;; Alternatively, there is a mailing list that only gets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
715 ;;; announcements of new efs releases. This is called efs-announce,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
716 ;;; and can be subscribed to by e-mailing to the -request address as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
717 ;;; above. Please make it clear in the request which mailing list you
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
718 ;;; wish to join.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
719 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
720
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
721 ;;; Known bugs:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
722 ;;; -----------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
723 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
724 ;;; If you hit a bug in this list, please report it anyway. Most of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
725 ;;; the bugs here remain unfixed because they are considered too
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
726 ;;; esoteric to be a high priority. If one of them gets reported
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
727 ;;; enough, we will likely change our view on that.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
728 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
729 ;;; 1) efs does not check to make sure that when creating a new file,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
730 ;;; you provide a valid filename for the remote operating system.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
731 ;;; If you do not, then the remote FTP server will most likely
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
732 ;;; translate your filename in some way. This may cause efs to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
733 ;;; get confused about what exactly is the name of the file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
734 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
735 ;;; 2) For CMS support, we send too many cd's. Since cd's are cheap, I haven't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
736 ;;; worried about this too much. Eventually, we should have some caching
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
737 ;;; of the current minidisk. This is complicated by the fact that some
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
738 ;;; CMS servers lie about the current minidisk, so sending redundant
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
739 ;;; cd's helps us recover in this case.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
740 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
741 ;;; 3) The code to do compression of files over ftp is not as careful as it
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
742 ;;; should be. It deletes the old remote version of the file, before
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
743 ;;; actually checking if the local to remote transfer of the compressed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
744 ;;; file succeeds. Of course to delete the original version of the file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
745 ;;; after transferring the compressed version back is also dangerous,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
746 ;;; because some OS's have severe restrictions on the length of filenames,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
747 ;;; and when the compressed version is copied back the "-Z" or ".Z" may be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
748 ;;; truncated. Then, efs would delete the only remaining version of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
749 ;;; the file. Maybe efs should make backups when it compresses files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
750 ;;; (of course, the backup "~" could also be truncated off, sigh...).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
751 ;;; Suggestions?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
752 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
753 ;;; 4) If a dir listing is attempted for an empty directory on (at least
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
754 ;;; some) VMS hosts, an ftp error is given. This is really an ftp bug, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
755 ;;; I don't know how to get efs work to around it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
756 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
757 ;;; 5) efs gets confused by directories containing file names with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
758 ;;; embedded newlines. A temporary solution is to add "q" to your
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
759 ;;; dired listing switches. As long as your dired listing switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
760 ;;; also contain "l" and either "a" or "A", efs will use these
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
761 ;;; switches to get listings for its internal cache. The "q" switch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
762 ;;; should force listings to be exactly one file per line. You
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
763 ;;; still will not be able to access a file with embedded newlines,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
764 ;;; but at least it won't mess up the parsing of the rest of the files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
765 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
766 ;;; 6) efs cannot parse symlinks which have an embedded " -> "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
767 ;;; in their name. It's alright to have an embedded " -> " in the name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
768 ;;; of any other type of file. A fix is possible, but probably not worth
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
769 ;;; the trouble. If you disagree, send us a bug report.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
770 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
771 ;;; 7) efs doesn't handle context-dep. files in H-switch listings on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
772 ;;; HP's. It wouldn't be such a big roaring deal to fix this. I'm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
773 ;;; waiting until I get an actual bug report though.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
774 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
775 ;;; 8) If a hard link is added or deleted, efs will not update its
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
776 ;;; internal cache of the link count for other names of the file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
777 ;;; This may cause file-nlinks to return incorrectly. Reverting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
778 ;;; any dired buffer containing other names for the file will
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
779 ;;; cause the file data to be updated, including the link counts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
780 ;;; A fix for this problem is known and will be eventually
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
781 ;;; implemented. How it is implemented will depend on how we decide
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
782 ;;; to handle inodes. See below.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
783 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
784 ;;; 9) efs is unable to parse R-switch listings from remote unix hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
785 ;;; This is inefficient, because efs will insist on doing individual
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
786 ;;; listings of the subdirectories to get its file information.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
787 ;;; This may be fixed if there is enough demand.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
788 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
789 ;;; 10) In file-attributes, efs returns a fake inode number. Of course
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
790 ;;; this is necessary, but this inode number is not even necessarily
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
791 ;;; unique. It is simply the sum of the characters (treated as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
792 ;;; integers) in the host name, user name, and file name. Possible
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
793 ;;; ways to get a unique inode number are:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
794 ;;; a) Simply keep a count of all remote file in the cache, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
795 ;;; return the file's position in this count as a negative number.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
796 ;;; b) For unix systems, we could actually get at the real inode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
797 ;;; number on the remote host, by adding an "i" to the ls switches.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
798 ;;; The inode numbers would then be removed from the listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
799 ;;; returned by efs-ls, if the caller hadn't requested the "i"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
800 ;;; switch. We could then make a unique number out of the host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
801 ;;; and the real inode number.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
802 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
803 ;;; 11) efs tries to determine if a file is readable or writable by comparing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
804 ;;; the file modes, file owner, and user name under which it is logged
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
805 ;;; into the remote host. This does not take into account groups.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
806 ;;; We simply assume that the user belongs to all groups. As a result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
807 ;;; we may assume that a file is writable, when in fact it is not.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
808 ;;; Groups are tough to handle correctly over FTP. Suggestions?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
809 ;;; (For new FTP servers, can do a "QUOTE SITE EXEC groups" to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
810 ;;; handle this.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
811
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
812 ;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
813 ;;; Technical information on this package:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
814 ;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
815
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
816 ;;; efs hooks onto the following functions using the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
817 ;;; file-name-handler-alist. Depending on which version of emacs you
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
818 ;;; are using, not all of these functions may access this alist. In
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
819 ;;; this case, efs overloads the definitions of these functions with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
820 ;;; versions that do access the file-name-handler-alist. These
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
821 ;;; overloads are done in efs's version-specific files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
822 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
823 ;;; abbreviate-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
824 ;;; backup-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
825 ;;; copy-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
826 ;;; create-file-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
827 ;;; delete-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
828 ;;; delete-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
829 ;;; directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
830 ;;; directory-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
831 ;;; file-attributes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
832 ;;; file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
833 ;;; file-exists-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
834 ;;; file-local-copy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
835 ;;; file-modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
836 ;;; file-name-all-completions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
837 ;;; file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
838 ;;; file-name-completion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
839 ;;; file-name-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
840 ;;; file-name-nondirectory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
841 ;;; file-name-sans-versions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
842 ;;; file-newer-than-file-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
843 ;;; file-readable-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
844 ;;; file-executable-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
845 ;;; file-accessible-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
846 ;;; file-symlink-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
847 ;;; file-writable-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
848 ;;; get-file-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
849 ;;; insert-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
850 ;;; insert-file-contents
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
851 ;;; list-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
852 ;;; make-directory-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
853 ;;; rename-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
854 ;;; set-file-modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
855 ;;; set-visited-file-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
856 ;;; substitute-in-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
857 ;;; verify-visited-file-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
858 ;;; write-region
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
859 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
860 ;;; The following functions are overloaded in efs.el, because they cannot
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
861 ;;; be handled via the file-name-handler-alist.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
862 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
863 ;;; expand-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
864 ;;; load
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
865 ;;; read-file-name-internal (Emacs 18, only)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
866 ;;; require
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
867 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
868 ;;; The following dired functions are handled by hooking them into the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
869 ;;; the file-name-handler-alist. This is done in efs-dired.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
870 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
871 ;;; efs-dired-compress-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
872 ;;; eds-dired-print-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
873 ;;; efs-dired-make-compressed-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
874 ;;; efs-compress-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
875 ;;; efs-dired-print-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
876 ;;; efs-dired-create-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
877 ;;; efs-dired-recursive-delete-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
878 ;;; efs-dired-uncache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
879 ;;; efs-dired-call-process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
880 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
881 ;;; In efs-dired.el, the following dired finctions are overloaded.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
882 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
883 ;;; dired-collect-file-versions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
884 ;;; dired-find-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
885 ;;; dired-flag-backup-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
886 ;;; dired-get-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
887 ;;; dired-insert-headerline
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
888 ;;; dired-move-to-end-of-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
889 ;;; dired-move-to-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
890 ;;; dired-run-shell-command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
891 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
892 ;;; efs makes use of the following hooks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
893 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
894 ;;; diff-load-hook
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
895 ;;; dired-before-readin-hook
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
896 ;;; find-file-hooks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
897 ;;; dired-grep-load-hook
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
898
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
899 ;;; LISPDIR ENTRY for the Elisp Archive:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
900 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
901 ;;; LCD Archive Entry:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
902 ;;; efs|Andy Norman and Sandy Rutherford
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
903 ;;; |ange@hplb.hpl.hp.com and sandy@ibm550.sissa.it
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
904 ;;; |transparent FTP Support for GNU Emacs
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 22
diff changeset
905 ;;; |$Date: 94/08/25 $|$efs release: 1.15 beta $|
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
906
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
907 ;;; Host and listing type notation:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
908 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
909 ;;; The functions efs-host-type and efs-listing-type, and the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
910 ;;; variable efs-dired-host-type follow the following conventions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
911 ;;; for remote host types.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
912 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
913 ;;; nil = local host type, whatever that is (probably unix).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
914 ;;; Think nil as in "not a remote host". This value is used by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
915 ;;; efs-dired-host-type for local buffers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
916 ;;; (efs-host-type nil) => nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
917 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
918 ;;; 'type = a remote host of TYPE type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
919 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
920 ;;; 'type:list = a remote host using listing type 'type:list.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
921 ;;; This is currently used for Unix dl (descriptive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
922 ;;; listings), when efs-dired-host-type is set to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
923 ;;; 'unix:dl, and to support the myriad of DOS FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
924 ;;; servers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
925
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
926 ;;; Supported host and listing types:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
927 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
928 ;;; unknown, unix, dumb-unix, bsd-unix, sysV-unix, next-unix,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
929 ;;; super-dumb-unix, dumb-apollo-unix,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
930 ;;; apollo-unix, unix:dl, dos-distinct, ka9q, dos, dos:ftp, dos:novell,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
931 ;;; dos:ncsa, dos:winsock, vos, hell, dos:microsoft, super-dumb-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
932 ;;; vms, cms, mts, mvs, mvs:tcp mvs:nih tops-20, mpe, ti-twenex,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
933 ;;; ti-explorer, os2, vos,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
934 ;;; vms:full, guardian, ms-unix (This is the Microsoft NT Windows server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
935 ;;; in unix mode.), plan9, unix:unknown, nos-ve (actually NOS/VE).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
936
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
937 ;;; Host and listing type hierarchy:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
938 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
939 ;;; unknown: unix, dumb-unix, sysV-unix, bsd-unix, next-unix, apollo-unix,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
940 ;;; ka9q, dos-distinct, unix:dl, hell,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
941 ;;; super-dumb-unix, dumb-apollo-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
942 ;;; unix: sysV-unix, bsd-unix, next-unix, apollo-unix, unix:dl
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
943 ;;; dos: dos:ftp, dos:novell, dos:ncsa, dos:microsoft, dos:winsock
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
944 ;;; dumb-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
945 ;;; bsd-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
946 ;;; sysV-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
947 ;;; next-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
948 ;;; apollo-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
949 ;;; dumb-apollo-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
950 ;;; unix:dl:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
951 ;;; unix:unknown: unix:dl, unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
952 ;;; super-dumb-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
953 ;;; dos-distinct:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
954 ;;; dos:ftp:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
955 ;;; dos:novell:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
956 ;;; dos:microsoft
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
957 ;;; ka9q:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
958 ;;; vms: vms:full
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
959 ;;; cms:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
960 ;;; mts:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
961 ;;; mvs: mvs:tcp, mvs:nih
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
962 ;;; mvs:tcp:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
963 ;;; mvs:nih:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
964 ;;; tops-20:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
965 ;;; ti-twenex:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
966 ;;; ti-explorer:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
967 ;;; os2:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
968 ;;; vos:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
969 ;;; vms:full:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
970 ;;; dos:ncsa:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
971 ;;; dos:winsock:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
972 ;;; vos:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
973 ;;; hell:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
974 ;;; guardian:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
975 ;;; ms-unix:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
976 ;;; plan9:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
977 ;;; nos-ve:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
978 ;;; coke:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
979 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
980
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
981
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
982 ;;;; ================================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
983 ;;;; >0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
984 ;;;; Table of Contents for efs.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
985 ;;;; ================================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
986 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
987 ;; Each section of efs.el is labelled by >#, where # is the number of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
988 ;; the section.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
989 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
990 ;; 1. Provisions, requirements, and autoloads.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
991 ;; 2. Variable definitions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
992 ;; 3. Utilities.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
993 ;; 4. Hosts, users, accounts, and passwords.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
994 ;; 5. FTP client process and server responses.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
995 ;; 6. Sending commands to the FTP server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
996 ;; 7. Parsing and storing remote file system data.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
997 ;; 8. Redefinitions of standard GNU Emacs functions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
998 ;; 9. Multiple host type support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
999 ;; 10. Attaching onto the appropriate emacs version.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1000
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1001
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1002 ;;;; ================================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1003 ;;;; >1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1004 ;;;; General provisions, requirements, and autoloads.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1005 ;;;; Host type, and local emacs type dependent loads, and autoloads
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1006 ;;;; are in the last two sections of this file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1007 ;;;; ================================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1008
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1009 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1010 ;;;; Provide the package (Do this now to avoid an infinite loop)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1011 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1012
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1013 (provide 'efs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1014
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1015 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1016 ;;;; Our requirements.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1017 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1018
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1019 (require 'backquote)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1020 (require 'comint)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1021 (require 'efs-defun)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1022 (require 'efs-netrc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1023 (require 'efs-cu)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1024 (require 'efs-ovwrt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1025 ;; Do this last, as it installs efs into the file-name-handler-alist.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1026 (require 'efs-fnh)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1027
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1028 (autoload 'efs-report-bug "efs-report" "Submit a bug report for efs." t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1029 (autoload 'efs-gwp-start "efs-gwp" ; For interactive gateways.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1030 "Login to the gateway machine and fire up an FTP client.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1031 (autoload 'efs-kerberos-login "efs-kerberos")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1032 (autoload 'efs-insert-directory "efs-dired" "Insert a directory listing.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1033 (autoload 'efs-set-mdtm-of "efs-cp-p")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1034 (autoload 'diff-latest-backup-file "diff")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1035 (autoload 'read-passwd "passwd" "Read a password from the minibuffer." t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1036
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1037
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1038 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1039 ;;;; >2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1040 ;;;; Variable Definitions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1041 ;;;; **** The user configuration variables are in ****
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1042 ;;;; **** the second subsection of this section. ****
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1043 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1044
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1045 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1046 ;;;; Constant Definitions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1047 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1048
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1049 (defconst efs-version
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1050 (concat (substring "$efs release: 1.15 $" 14 -2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1051 "/"
24
4103f0995bd7 Import from CVS: tag r19-15b95
cvs
parents: 22
diff changeset
1052 (substring "$Revision: 1.56 $" 11 -2)))
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1053
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1054 (defconst efs-time-zero 1970) ; we count time from midnight, Jan 1, 1970 GMT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1055
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1056 (defconst efs-dumb-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1057 '(dumb-unix super-dumb-unix vms cms mts ti-twenex ti-explorer dos mvs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1058 tops-20 mpe ka9q dos-distinct os2 vos hell guardian
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1059 netware cms-knet nos-ve coke dumb-apollo-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1060 "List of host types that can't take UNIX ls-style listing options.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1061 ;; dos-distinct only ignores ls switches; it doesn't barf.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1062 ;; Still treat it as dumb.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1063
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1064 (defconst efs-unix-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1065 '(unix sysV-unix bsd-unix next-unix apollo-unix dumb-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1066 dumb-apollo-unix super-dumb-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1067 "List of unix host types.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1068
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1069 (defconst efs-version-host-types '(vms tops-20 ti-twenex ti-explorer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1070 "List of host-types which associated a version number to all files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1071 This is not the same as associating version numbers to only backup files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1072 ;; Note that on these systems,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1073 ;; (file-name-sans-versions EXISTING-FILE) does not exist as a file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1074
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1075 (defconst efs-single-extension-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1076 '(vms tops-20 ti-twenex ti-explorer cms mvs dos ka9q dos-distinct hell
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1077 netware ms-unix plan9 cms-knet nos-ve)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1078 "List of host types which allow at most one extension on a file name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1079 Extensions are deliminated by \".\". In addition, these host-types must
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1080 allow \"-\" in file names, because it will be used to add additional extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1081 to indicate compressed files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1082
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1083 (defconst efs-idle-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1084 (append '(coke unknown) efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1085 ;; List of host types for which it is possible that the SITE IDLE command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1086 ;; is supported.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1087
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1088 (defconst efs-listing-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1089 '(unix:dl unix:unknown
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1090 dos:novell dos:ftp dos:ncsa dos:microsoft dos:stcp dos:winsock
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1091 mvs:nih mvs:tcp mvs:tcp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1092 vms:full)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1093 "List of supported listing types")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1094
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1095 (defconst efs-nlist-listing-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1096 '(vms:full))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1097 ;; Listing types which give a long useless listing when asked for a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1098 ;; LIST. For these, use an NLST instead. This can only be done
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1099 ;; when there is some way to distinguish directories from
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1100 ;; plain files in an NLST.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1101
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1102 (defconst efs-opaque-gateways '(remsh interactive))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1103 ;; List of gateway types for which we need to do explicit file handling on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1104 ;; the gateway machine.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1105
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1106 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1107 ;;;; User customization variables. Please read through these carefully.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1108 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1109
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1110 ;;;>>>> If you are not fully connected to the internet, <<<<
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1111 ;;;>>>> and need to use a gateway (no matter how transparent) <<<<
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1112 ;;;>>>> you will need to set some of the following variables. <<<<
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1113 ;;;>>>> Read the documentation carefully. <<<<
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1114
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1115 (defvar efs-local-host-regexp ".*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1116 "Regexp to match names of local hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1117 These are hosts to which it is possible to obtain a direct internet
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1118 connection. Even if the host is accessible by a very transparent FTP gateway,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1119 it does not qualify as a local host. The test to determine if machine A is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1120 local to your machine is if it is possible to ftp from A _back_ to your
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1121 local machine. Also, open-network-stream must be able to reach the host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1122 in question.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1123
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1124 (defvar efs-ftp-local-host-regexp ".*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1125 "Regexp to match the names of hosts reachable by a direct ftp connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1126 This regexp should match the names of hosts which can be reached using ftp,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1127 without requiring any explicit connection to a gateway. If you have a smart
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1128 ftp client which is able to transparently go through a gateway, this will
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1129 differ from `efs-local-host-regexp'.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1130
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1131 (defvar efs-gateway-host nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1132 "If non-nil, this must be the name of your ftp gateway machine.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1133 If your net world is divided into two domains according to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1134 `efs-local-ftp-host-regexp', set this variable to the name of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1135 gateway machine.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1136
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1137 (defvar efs-gateway-type nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1138 "Specifies which type of gateway you wish efs to use.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1139 This should be a list, the first element of which is a symbol denoting the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1140 gateway type, and following elements give data on how to use the gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1141
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1142 The following possibilities are supported:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1143
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1144 '(local FTP-PROGRAM FTP-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1145 This means that your local host is itself the gateway. However,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1146 you need to run a special FTP client to access outside hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1147 FTP-PROGRAM should be the name of this FTP client, and FTP-PROGRAM-ARGS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1148 is a list of arguments to pass to it \(probably set this to the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1149 efs-ftp-program-args <V>\). Note that if your gateway is of this type,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1150 then you would set efs-gateway-host to nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1151
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1152 '(proxy FTP-PROGRAM FTP-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1153 This indicates that your gateway works by first FTP'ing to it, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1154 then giving a USER command of the form \"USER <username>@<host>\".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1155 FTP-PROGRAM is the FTP program to use to connect to the gateway; this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1156 is most likely \"ftp\". FTP-PROGRAM-ARGS is a list of arguments to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1157 pass to it. You likely want this to be set to the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1158 efs-ftp-program-args <V>. If the connection to the gateway FTP server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1159 is to be on a port different from 21, set efs-gateway-host to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1160 \"<host>#<port>\".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1161
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1162 '(raptor FTP-PROGRAM FTP-PROGRAM-ARGS USER)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1163 This is for the gateway called raptor by Eagle. After connecting to the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1164 the gateway, the command \"user <user>@host USER\" is issued to login
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1165 as <user> on <host>, where USER is an authentication username for the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1166 gateway. After issuing the password for the remote host, efs will
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1167 send the password for USER on efs-gateway-host <V> as an account command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1168
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1169 '(interlock FTP-PROGRAM FTP-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1170 This is for the interlock gateway. The exact login sequence is to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1171 connect to the gateway specified by efs-gateway-host <V>, send the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1172 gateway password with a PASS command, send the command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1173 \"user <user>@<host>\" to connect to remote host <host> as user <user>,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1174 and finally to send the password for <user> on <host> with a second
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1175 PASS command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1176
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1177 '(kerberos FTP-PROGRAM FTP-PROGRAM-ARGS KINIT-PROGRAM KINIT-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1178 This is for the kerberos gateway where you need to run a program (kinit) to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1179 obtain a ticket for gateway authroization first. FTP-PROGRAM should be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1180 the name of the FTP client that you use to connect to the gateway. This
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1181 may likely be \"iftp\". FTP-PROGRAM-ARGS are the arguments that you need
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1182 to pass to FTP-PROGRAM. This is probably the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1183 efs-ftp-program-args <V>. KINIT-PROGRAM is the name of the program to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1184 run in order to obtain a ticket. This is probably \"kinit\".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1185 KINIT-PROGRAM-ARGS is a list og strings indicating any arguments that you
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1186 need to pass to KINIT-PROGRAM. Most likely this is nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1187
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1188 '(remsh GATEWAY-PROGRAM GATEWAY-PROGRAM-ARGS FTP-PROGRAM FTP-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1189 This indicates that you wish to run FTP on your gateway using a remote shell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1190 GATEWAY-PROGRAM is the name of the program to use to start a remote shell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1191 It is assumed that it is not necessary to provide a password to start
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1192 this remote shell. Likely values are \"remsh\" or \"rsh\".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1193 GATEWAY-PROGRAM-ARGS is a list of arguments to pass to GATEWAY-PROGRAM.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1194 FTP-PROGRAM is the name of the FTP program on the gateway. A likely setting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1195 of this is \"ftp\". FTP-PROGRAM-ARGS is a list of arguments to pass to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1196 FTP-PROGRAM. Most likely these should be set to the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1197 efs-ftp-program-args <V>.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1198
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1199 '(interactive GATEWAY-PROGRAM GATEWAY-PROGRAM-ARGS FTP-PROGRAM
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1200 FTP-PROGRAM-ARGS)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1201 This indicates that you need to start an interactive login on your gatway,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1202 using rlogin, telnet, or something similar. GATEWAY-PROGRAM is the name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1203 of the program to use to log in to the gateway, and GATEWAY-PROGRAM-ARGS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1204 is a list of arguments to pass to it. FTP-PROGRAM is the name of the FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1205 program on the gateway. A likely setting for this variable would be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1206 \"exec ftp\". FTP-PROGRAM-ARGS is a list of arguments to pass
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1207 to FTP-PROGRAM. You probably want to set these to the same value as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1208 efs-ftp-program-args <V>. If you are using this option, read the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1209 documentation at the top of efs-gwp.el, and see
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1210 efs-gwp-setup-term-command <V>.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1211
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1212 (defvar efs-gateway-hash-mark-size nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1213 "*Value of `efs-hash-mark-size' for FTP clients on `efs-gateway-host'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1214 See the documentation of these variables for more information.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1215
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1216 (defvar efs-gateway-incoming-binary-hm-size nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1217 "*Value of `efs-incoming-binary-hm-size' for `efs-gateway-host'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1218 See documentation of these variables for more information.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1219
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1220 (defvar efs-gateway-tmp-name-template "/tmp/efs"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1221 "Template used to create temporary files when ftp-ing through a gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1222 This should be the name of the file on the gateway, and not necessarily
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1223 the name on the local host.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1224
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1225 (defvar efs-gateway-mounted-dirs-alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1226 "An alist of directories cross-mounted between the gateway and local host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1227 Each entry is of the form \( DIR1 . DIR2 \), where DIR1 is the name of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1228 directory on the local host, and DIR2 is its name on the remote host. Both
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1229 DIR1 and DIR2 must be specified in directory syntax, i.e. end in a slash.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1230 Note that we will assume that subdirs of DIR1 and DIR2 are also accessible
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1231 on both machines.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1232
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1233 (defvar efs-gateway-ftp-prompt-regexp "^\\(ftp\\|Ftp\\|FTP\\)> *"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1234 "*Regular expression to match the prompt of the gateway FTP client.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1235
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1236 ;;; End of gateway config variables.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1237
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1238 (defvar efs-tmp-name-template "/tmp/efs"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1239 "Template used to create temporary files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1240 If you are worried about security, make this a directory in some
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1241 bomb-proof cave somewhere. efs does clean up its temp files, but
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1242 they do live for short periods of time.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1243
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1244 (defvar efs-generate-anonymous-password t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1245 "*If t, use a password of `user@host' when logging in as the anonymous user.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1246 `host' is generated by the function `efs-system-fqdn'. If `system name' returns
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1247 a fully qualified domain name, `efs-system-fqdn' will return this. Otherwise,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1248 it will attempt to use nslookup to obtain a fully qualified domain name. If
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1249 this is unsuccessful, the returned value will be the same as `system-name',
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1250 whether this is a fully qualified domain name or not.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1251
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1252 If a string then use that as the password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1253
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1254 If nil then prompt the user for a password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1255
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1256 Beware that some operating systems, such as MVS, restrict substantially
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1257 the password length. The login will fail with a weird error message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1258 if you exceed it.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1259
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1260 (defvar efs-high-security-hosts nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1261 "*Indicates host user pairs for which passwords should not be cached.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1262 If non-nil, should be a regexp matching user@host constructions for which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1263 efs should not store passwords in its internal cache.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1264
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1265 ;; The following regexps are tested in the following order:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1266 ;; efs-binary-file-host-regexp, efs-36-bit-binary-file-name-regexp,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1267 ;; efs-binary-file-name-regexp, efs-text-file-name-regexp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1268 ;; File names which match nothing are transferred in 'image mode.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1269
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1270 ;; If we're not careful, we're going to blow the regexp stack here.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1271 ;; Probably should move to a list of regexps. Slower, but safer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1272 ;; This is not a problem in Emacs 19.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1273 (defvar efs-binary-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1274 (concat "\\." ; the dot
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1275 ;; extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1276 "\\([zZ]\\|t?gz\\|lzh\\|arc\\|zip\\|zoo\\|ta[rz]\\|dvi\\|sit\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1277 "ps\\|elc\\|gif\\|Z-part-..\\|tpz\\|exe\\|[jm]pg\\|TZ[a-z]?\\|lib\\)"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1278 "\\(~\\|~[0-9]+~\\)?$" ; backups
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1279 "\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1280 ;; UPPER CASE LAND
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1281 "\\."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1282 "\\(ARC\\|ELC\\|TAGS\\|EXE\\|ZIP\\|DVI\|ZOO\\|GIF\\|T?GZ\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1283 "[JM]PG\\)"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1284 "\\([.#;][0-9]+\\)?$" ; versions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1285 )
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1286 "*Files whose names match this regexp will be considered to be binary.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1287 By binary here, we mean 8-bit binary files (the usual unix binary files).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1288 If nil, no files will be considered to be binary.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1289
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1290 (defvar efs-binary-file-host-regexp nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1291 "*All files on hosts matching this regexp are treated as 8-bit binary.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1292 Setting this to nil, inhibits this feature.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1293
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1294 (defvar efs-36-bit-binary-file-name-regexp nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1295 "*Files whose names match this regexp will be considered to PDP 10 binaries.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1296 These are 36-bit word-aligned binary files. This is really only relevant for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1297 files on PDP 10's, and similar machines. If nil, no files will be considered
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1298 to be PDP 10 binaries.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1299
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1300 (defvar efs-text-file-name-regexp ".*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1301 "*Files whose names match this regexp will be considered to be text files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1302
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1303 (defvar efs-prompt-for-transfer-type nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1304 "*If non-nil, efs will prompt for the transfer type for each file transfer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1305 The command efs-prompt-for-transfer-type can be used to toggle its value.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1306
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1307 (defvar efs-treat-crlf-as-nl nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1308 "*Controls how file systems using CRLF as end of line are treated.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1309 If non-nil, such file systems will be considered equivalent to those which use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1310 LF as end of line. This is particularly relevant to transfers between DOS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1311 systems and UNIX. Setting this to be non-nil will cause all file transfers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1312 between DOS and UNIX systems to use be image or binary transfers.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1313
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1314 (defvar efs-send-hash t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1315 "*If non-nil, send the HASH command to the FTP client.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1316
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1317 (defvar efs-hash-mark-size nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1318 "*Default size, in bytes, between hash-marks when transferring a file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1319 If this is nil then efs will attempt to assign a value based on the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1320 output of the HASH command. Also, if this variable is incorrectly set,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1321 then efs will try to correct it based on the size of the last file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1322 transferred, and the number hashes outputed by the client during the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1323 transfer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1324
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1325 The variable `efs-gateway-hash-mark-size' defines the corresponding value
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1326 for the FTP client on the gateway, if you are using a gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1327
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1328 Some client-server combinations do not correctly compute the number of hash
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1329 marks for incoming binary transfers. In this case, a separate variable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1330 `efs-incoming-binary-hm-size' can be used to set a default value of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1331 hash mark size for incoming binary transfers.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1332
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1333 (defvar efs-incoming-binary-hm-size nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1334 "*Default hash mark size for incoming binary transfers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1335 If this is nil, incoming binary transfers will use `efs-hash-mark-size' as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1336 the default. See the documentation of this variable for more details.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1337
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1338 (defvar efs-verbose t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1339 "*If non-NIL then be chatty about interaction with the FTP process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1340 If 0 do not give % transferred reports for asynchronous commands and status
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1341 reports for commands verifying file modtimes, but report on everything else.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1342
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1343 (defvar efs-message-interval 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1344 "*Defines the minimum time in seconds between status messages.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1345 A new status message is not displayed, if one has already been given
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1346 within this period of time.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1347
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1348 (defvar efs-max-ftp-buffer-size 3000
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1349 "*Maximum size in characters of FTP process buffer, before it is trimmed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1350 The buffer is trimmed to approximately half this size. Setting this to nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1351 inhibits trimming of FTP process buffers.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1352
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1353 (defvar efs-ls-cache-max 5
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1354 "*Maximum number of directory listings to be cached in efs-ls-cache.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1355
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1356 (defvar efs-mode-line-format " ftp(%d)"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1357 "Format string used to determine how FTP activity is shown on the mode line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1358 It is passed to format, with second argument the number of active FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1359 sessions as an integer.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1360
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1361 (defvar efs-show-host-type-in-dired t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1362 "If non-nil, show the system type on the mode line of remote dired buffers.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1363
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1364 (defvar efs-ftp-activity-function nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1365 "Function called to indicate FTP activity.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1366 It must have exactly one argument, the number of active FTP sessions as an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1367 integer.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1368
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1369 (defvar efs-ftp-program-name "ftp"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1370 "Name of FTP program to run.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1371
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1372 (defvar efs-ftp-program-args '("-i" "-n" "-g" "-v")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1373 "*A list of arguments passed to the FTP program when started.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1374
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1375 (defvar efs-ftp-prompt-regexp "^\\(ftp\\|Ftp\\|FTP\\)> *"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1376 "*Regular expression to match the prompt of your FTP client.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1377
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1378 (defvar efs-nslookup-program "nslookup"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1379 "*If non-NIL then a string naming nslookup program." )
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1380
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1381 (defvar efs-nslookup-on-connect nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1382 "*If non-NIL then use nslookup to resolve the host name before connecting.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1383
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1384 (defvar efs-nslookup-threshold 1000
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1385 "How many iterations efs waits on the nslookup program.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1386 Applies when nslookup is used to compute a fully qualified domain name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1387 for the local host, in the case when `system-name' does not return one.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1388 If you set this to nil, efs will wait an arbitrary amount of time to get
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1389 output.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1390
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1391 (defvar efs-make-backup-files efs-unix-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1392 "*A list of operating systems for which efs will make Emacs backup files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1393 The backup files are made on the remote host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1394
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1395 For example:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1396 '\(unix sysV-unix bsd-unix apollo-unix dumb-unix\) makes sense, but
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1397 '\(unix vms\) would be silly, since vms makes its own backups.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1398
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1399 ;; Is this variable really useful? We should try to figure a way to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1400 ;; do local copies on a remote machine that doesn't take forever.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1401 (defvar efs-backup-by-copying nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1402 "*Version of `backup by copying' for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1403 If non-nil, remote files will be backed up by copying, instead of by renaming.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1404 Note the copying will be done by moving the file through the local host -- a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1405 very time consuming operation.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1406
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1407 ;;; Auto-save variables. Relevant for auto-save.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1408
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1409 (defvar efs-auto-save 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1410 "*If 1, allows efs files to be auto-saved.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1411 If 0, suppresses auto-saving of efs files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1412 Don't use any other value.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1413
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1414 (defvar efs-auto-save-remotely nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1415 "*Determines where remote files are auto-saved.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1416
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1417 If nil, auto-saves for remote files will be written in `auto-save-directory'
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1418 or `auto-save-directory-fallback' if this isn't defined.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1419
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1420 If non-nil, causes the auto-save file for an efs file to be written in
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1421 the remote directory containing the file, rather than in a local directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1422 For remote files, this overrides a non-nil `auto-save-directory'. Local files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1423 are unaffected. If you want to use this feature, you probably only want to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1424 set this true in a few buffers, rather than globally. You might want to give
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1425 each buffer its own value using `make-variable-buffer-local'. It is usually
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1426 a good idea to auto-save remote files locally, because it is not only faster,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1427 but provides protection against a connection going down.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1428
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1429 See also variable `efs-auto-save'.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1430
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1431 (defvar efs-short-circuit-to-remote-root nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1432 "*Defines whether \"//\" short-circuits to the remote or local root.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1433
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1434 ;; Can we somehow grok this from system type? No.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1435 (defvar efs-local-apollo-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1436 (eq 0 (string-match "//" (or (getenv "HOME") (getenv "SHELL") "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1437 "*Defines whether the local machine is an apollo running Domain.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1438 This variable has nothing to do with efs, and should be basic to all
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1439 of emacs.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1440
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1441 (defvar efs-root-umask nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1442 "*umask to use for root logins.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1443
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1444 (defvar efs-anonymous-umask nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1445 "*umask to use for anonymous logins.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1446
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1447 (defvar efs-umask nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1448 "*umask to use for efs sessions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1449 If this is nil, then the setting of umask on the local host is used.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1450
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1451 ;; Eliminate these variables when Sun gets around to getting its FTP server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1452 ;; out of the stone age.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1453 (defvar efs-ding-on-umask-failure t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1454 "*Ring the bell if the umask command fails on a unix host. Many servers don't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1455 support this command, so if you get a lot of annoying failures, set this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1456 to nil.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1457
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1458 (defvar efs-ding-on-chmod-failure t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1459 "*Ring the bell if the chmod command fails on a unix host. Some servers don't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1460 support this command, so if you get a lot of annoying failures, set this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1461 to nil.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1462
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1463 ;; Please let us know if you can contribute more entries to this guessing game.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1464 (defvar efs-nlist-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1465 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1466 ;; Covers Ultrix, SunOS, and NeXT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1467 ((eq system-type 'berkeley-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1468 "ls")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1469 ((memq system-type '(hpux aix-v3 silicon-graphics-unix))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1470 "nlist")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1471 ;; Blind guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1472 ("ls"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1473 "*FTP client command for getting a brief listing (NLST) from the FTP server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1474 We try to guess this based on the local system-type, but obviously if you
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1475 are using a gateway, you'll have to set it yourself.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1476
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1477 (defvar efs-compute-remote-buffer-file-truename nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1478 "*If non-nil, `buffer-file-truename' will be computed for remote buffers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1479 In emacs 19, each buffer has a local variable, `buffer-file-truename',
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1480 which is used to ensure that symbolic links will not confuse emacs into
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1481 visiting the same file with two buffers. This variable is computed by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1482 chasing all symbolic links in `buffer-file-name', both at the level of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1483 file and at the level of all parent directories. Since this operation can be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1484 very time-consuming over FTP, this variable can be used to inhibit it.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1485
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1486 (defvar efs-buffer-name-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1487 "*Selects the case used for buffer names of case-insensitive file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1488 Case-insensitive file names are files on hosts whose host type is in
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1489 `efs-case-insensitive-host-types'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1490
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1491 If this is 'up upper case is used, if it is 'down lower case is used.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1492 If this has any other value, the case is inherited from the name used
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1493 to access the file.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1494
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1495 (defvar efs-fancy-buffer-names "%s@%s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1496 "Format used to compute names of buffers attached to remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1497
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1498 If this is nil, buffer names are computed in the usual way.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1499
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1500 If it is a string, then the it is passed to format with second and third
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1501 arguments the host name and file name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1502
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1503 Otherwise, it is assumed to be function taking three arguments, the host name,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1504 the user name, and the truncated file name. It should returns the name to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1505 be used for the buffer.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1506
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1507 (defvar efs-verify-anonymous-modtime nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1508 "*Determines if efs checks modtimes for remote files on anonymous logins.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1509 If non-nil, efs runs `verify-visited-file-modtime' for remote files on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1510 anonymous ftp logins. Since verify-visited-file-modtime slows things down,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1511 and most people aren't editing files on anonymous ftp logins, this is nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1512 by default.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1513
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1514 (defvar efs-verify-modtime-host-regexp ".*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1515 "*Regexp to match host names for which efs checks file modtimes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1516 If non-nil, efs will run `verify-visited-file-modtime' for remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1517 files on hosts matching this regexp. If nil, verify-visited-file-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1518 is supressed for all remote hosts. This is tested before
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1519 `efs-verify-anonymous-modtime'.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1520
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1521 (defvar efs-maximize-idle nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1522 "*If non-nil, efs will attempt to maximize the idle time out period.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1523 At some idle moment in the connection after login, efs will attempt to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1524 set the idle time out period to the maximum amount allowed by the server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1525 It applies only to non-anonymous logins on unix hosts.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1526
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1527 (defvar efs-expire-ftp-buffers t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1528 "*If non-nil ftp buffers will be expired.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1529 The buffers will be killed either after `efs-ftp-buffer-expire-time' has
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1530 elapsed with no activity, or the remote FTP server has timed out.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1531
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1532 (defvar efs-ftp-buffer-expire-time nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1533 "*If non-nil, the time after which ftp buffers will be expired.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1534 If nil, ftp buffers will be expired only when the remote server has timed out.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1535 If an integer, ftp buffers will be expired either when the remote server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1536 has timed out, or when this many seconds on inactivity has elapsed.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1537
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1538 ;; If you need to increase this variable much, it is likely that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1539 ;; the true problem is timing errors between the efs process filter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1540 ;; and the FTP server. This could either be caused by the server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1541 ;; not following RFC959 response codes, or a bug in efs. In either
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1542 ;; case please report the problem to us. If it's a bug, we'll fix it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1543 ;; If the server is at fault we may try to do something. Our rule
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1544 ;; of thumb is that we will support non-RFC959 behaviour, as long as
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1545 ;; it doesn't risk breaking efs for servers which behave properly.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1546
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1547 (defvar efs-retry-time 5
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1548 "*Number of seconds to wait before retrying if data doesn't arrive.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1549 The FTP command isn't retried, rather efs just takes a second look
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1550 for the data file. This might need to be increased for very slow FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1551 clients.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1552
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1553 (defvar efs-pty-check-threshold 1000
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1554 "*How long efs waits before deciding that it doesn't have a pty.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1555 Specifically it is the number of iterations through `accept-process-output'
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1556 that `efs-pty-p' waits before deciding that the pty is really a pipe.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1557 Set this to nil to inhibit checking for pty's. If efs seems to be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1558 mistaking some pty's for pipes, try increasing this number.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1559
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1560 (defvar efs-pty-check-retry-time 5
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1561 "*Number of seconds that efs waits before retrying a pty check.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1562 This can be lengthened, if your FTP client is slow to start.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1563
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1564 (defvar efs-suppress-abort-recursive-edit-and-then nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1565 "*If non-nil, `efs-abort-recursive-edit-and-then' will not run its function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1566 This means that when a recursive edit is in progress, automatic popping of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1567 FTP process buffer, and automatic popping of the bug report buffer will not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1568 work. `efs-abort-recursive-edit-and-then' works by forking a \"sleep 0\"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1569 process. On some unix implementations the forked process might be of the same
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1570 size as the original GNU Emacs process. Forking such a large process just to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1571 do a \"sleep 0\" is probably not good.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1572
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1573 (defvar efs-ftp-buffer-format "*ftp %s@%s*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1574 "Format to construct the name of FTP process buffers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1575 This string is fed to `format' with second and third arguments the user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1576 name and host name.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1577 ;; This does not affect the process name of the FTP client process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1578 ;; That is always *ftp USER@HOST*
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1579
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1580 (defvar efs-debug-ftp-connection nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1581 "*If non-nil, the user will be permitted to debug the FTP connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1582 This means that typing a C-g to the FTP process filter will give the user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1583 the option to type commands at the FTP connection. Normally, the connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1584 is killed first. Note that doing this may result in the FTP process filter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1585 getting out of synch with the FTP client, so using this feature routinely
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1586 isn't recommended.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1587
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1588 ;;; Hooks and crooks.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1589
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1590 (defvar efs-ftp-startup-hook nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1591 "Hook to run immediately after starting the FTP client.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1592 This hook is run before the FTP OPEN command is sent.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1593
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1594 (defvar efs-ftp-startup-function-alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1595 "Association list of functions to running after FTP login.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1596 This should be an alist of the form '\(\(REGEXP . FUNCTION\) ...\), where
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1597 REGEXP is a regular expression matched against the name of the remote host,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1598 and FUNCTION is a function of two arguments, HOST and USER. REGEXP is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1599 compared to the host name with `case-fold-search' bound to t. Only the first
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1600 match in the alist is run.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1601
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1602 (defvar efs-load-hook nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1603 "Hook to run immediately after loading efs.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1604 You can use it to alter definitions in efs.el, but why would you want
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1605 to do such a thing?")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1606
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1607 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1608 ;;;; Regexps for parsing FTP server responses.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1609 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1610 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1611 ;;; If you have to tune these variables, please let us know, so that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1612 ;;; we can get them right in the next release.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1613
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1614 (defvar efs-multi-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1615 ;; RFC959 compliant codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1616 "^[1-5][0-5][0-7]-")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1617 ;; Regexp to match the start of an FTP server multiline reply.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1618
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1619 (defvar efs-skip-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1620 ;; RFC959 compliant codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1621 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1622 "^110 \\|" ; Restart marker reply.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1623 "^125 \\|" ; Data connection already open; transfer starting.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1624 "^150 ")) ; File status OK; about to open connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1625 ;; Regexp to match an FTP server response which we wish to ignore.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1626
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1627 (defvar efs-cmd-ok-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1628 ;; RFC959 compliant
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1629 "^200 \\|^227 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1630 ;; Regexp to match the server command OK response.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1631 ;; Because PORT commands return this we usually ignore it. However, it is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1632 ;; a valid response for TYPE, SITE, and a few other commands (cf. RFC 959).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1633 ;; If we are explicitly sending a PORT, or one of these other commands,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1634 ;; then we don't want to ignore this response code. Also use this to match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1635 ;; the return code for PASV, as some clients burp these things out at odd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1636 ;; times.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1637
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1638 (defvar efs-pending-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1639 ;; RFC959 compliant
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1640 "^350 ") ; Requested file action, pending further information.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1641 ;; Regexp to match the \"requested file action, pending further information\"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1642 ;; message. These are usually ignored, except if we are using RNFR to test for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1643 ;; file existence.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1644
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1645 (defvar efs-cmd-ok-cmds
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1646 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1647 "^quote port \\|^type \\|^quote site \\|^chmod \\|^quote noop\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1648 "^quote pasv"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1649 ;; Regexp to match commands for which efs-cmd-ok-msgs is a valid server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1650 ;; response for success.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1651
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1652 (defvar efs-passwd-cmds
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1653 "^quote pass \\|^quote acct \\|^quote site gpass ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1654 ;; Regexp to match commands for sending passwords.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1655 ;; All text following (match-end 0) will be replaced by "Turtle Power!"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1656
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1657 (defvar efs-bytes-received-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1658 ;; Strictly a client response
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1659 "^[0-9]+ bytes ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1660 ;; Regexp to match the reply from the FTP client that it has finished
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1661 ;; receiving data.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1662
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1663 (defvar efs-server-confused-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1664 ;; ka9q uses this to indicate an incorrectly set transfer mode, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1665 ;; then does send a second completion code for the command. This does
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1666 ;; *not* conform to RFC959.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1667 "^100 Warning: type is ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1668 ;; Regexp to match non-standard response from the FTP server. This can
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1669 ;; sometimes be the result of an incorrectly set transfer mode. In this case
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1670 ;; we do not rely on the server to tell us when the data transfer is complete,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1671 ;; but check with the client.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1672
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1673 (defvar efs-good-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1674 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1675 ;; RFC959 compliant codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1676 "^2[01345][0-7] \\|" ; 2yz = positive completion reply
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1677 "^22[02-7] \\|" ; 221 = successful logout
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1678 ; (Sometimes get this with a timeout,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1679 ; so treat as fatal.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1680 "^3[0-5][0-7] \\|" ; 3yz = positive intermediate reply
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1681 ;; client codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1682 "^[Hh]ash mark "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1683 ;; Response to indicate that the requested action was successfully completed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1684
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1685 (defvar efs-failed-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1686 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1687 ;; RFC959 compliant codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1688 "^120 \\|" ; Service ready in nnn minutes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1689 "^450 \\|" ; File action not taken; file is unavailable, or busy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1690 "^452 \\|" ; Insufficient storage space on system.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1691 "^5[0-5][0-7] \\|" ; Permanent negative reply codes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1692 ;; When clients tell us that a file doesn't exist, or can't access.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1693 "^\\(local: +\\)?/[^ ]* +"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1694 "\\([Nn]o such file or directory\\|[Nn]ot a plain file\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1695 "The file access permissions do not allow \\|Is a directory\\b\\)"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1696 ;; Regexp to match responses for failed commands. However, the ftp connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1697 ;; is assumed to be good.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1698
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1699 (defvar efs-fatal-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1700 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1701 ;; RFC959 codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1702 "^221 \\|" ; Service closing control connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1703 "^421 \\|" ; Service not available.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1704 "^425 \\|" ; Can't open data connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1705 "^426 \\|" ; Connection closed, transfer aborted.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1706 "^451 \\|" ; Requested action aborted, local error in processing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1707 ;; RFC959 non-compliant codes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1708 "^552 Maximum Idle Time Exceded\\.$\\|" ; Hellsoft server uses this to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1709 ; indicate a timeout. 552 is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1710 ; supposed to be used for exceeded
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1711 ; storage allocation. Note that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1712 ; they also misspelled the error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1713 ; message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1714 ;; client problems
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1715 "^ftp: \\|^Not connected\\|^rcmd: \\|^No control connection\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1716 "^unknown host\\|: unknown host$\\|^lost connection\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1717 "^[Ss]egmentation fault\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1718 ;; Make sure that the "local: " isn't just a message about a file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1719 "^local: [^/]\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1720 ;; Gateways
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1721 "^iftp: cannot authenticate to server\\b"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1722 ))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1723 ;; Regexp to match responses that something has gone drastically wrong with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1724 ;; either the client, server, or connection. We kill the ftp process, and start
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1725 ;; anew.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1726
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1727 (defvar efs-unknown-response-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1728 "^[0-9][0-9][0-9] ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1729 ;; Regexp to match server response codes that we don't understand. This
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1730 ;; is tested after all the other regexp, so it can match everything.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1731
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1732 (defvar efs-pasv-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1733 ;; According to RFC959.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1734 "^227 .*(\\([0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+\\))$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1735 ;; Matches the output of a PASV. (match-beginning 1) and (match-end 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1736 ;; must bracket the IP address and port.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1737
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1738 (defvar efs-syst-msgs "^215 \\|^210 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1739 ;; 215 is RFC959. Plan 9 FTP server returns a 210. 210 is not assigned in
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1740 ;; RFC 959.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1741 ;; The plan 9 people tell me that they fixed this. -- sr 18/4/94
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1742 ;; Matches the output of a SYST.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1743
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1744 (defvar efs-mdtm-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1745 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1746 "^213 [0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1747 "[0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1748 ;; Regexp to match the output of a quote mdtm command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1749
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1750 (defvar efs-idle-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1751 "^200 [^0-9]+ \\([0-9]+\\)[^0-9]* max \\([0-9]+\\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1752 ;; Regexp to match the output of a SITE IDLE command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1753 ;; Match 1 should refer to the current idle time, and match 2 the maximum
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1754 ;; idle time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1755
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1756 (defvar efs-write-protect-msgs "^532 ") ; RFC959
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1757 ;; Regexp to match a server ressponse to indicate that a STOR failed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1758 ;; because of insufficient write privileges.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1759
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1760 (defvar efs-hash-mark-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1761 "[hH]ash mark [^0-9]*\\([0-9]+\\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1762 ;; Regexp matching the FTP client's output upon doing a HASH command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1763
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1764 (defvar efs-xfer-size-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1765 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1766 ;; UN*X
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1767 "^150 .* connection for .* (\\([0-9]+\\) bytes)\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1768 ;; Wollongong VMS server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1769 "^125 .* transfer started for .* (\\([0-9]+\\) bytes)\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1770 ;; TOPS-20 server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1771 "^150 .* retrieve of .* ([0-9]+ pages?, \\([0-9]+\\) 7-bit bytes)"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1772 ;; Regular expression used to determine the number of bytes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1773 ;; in a FTP transfer. The first (match-beginning #) which is non-nil is assumed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1774 ;; to give the size.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1775
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1776 (defvar efs-expand-dir-msgs "^550 \\([^: ]+\\):")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1777 ;; Regexp to match the error response from a "get ~sandy".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1778 ;; By parsing the error, we can get a quick expansion of ~sandy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1779 ;; According to RFC 959, should be a 550.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1780
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1781 (defvar efs-gateway-fatal-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1782 "No route to host\\|Connection closed\\|No such host\\|Login incorrect")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1783 ;; Regular expression matching messages from the rlogin / telnet process that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1784 ;; indicates that logging in to the gateway machine has gone wrong.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1785
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1786 (defvar efs-too-many-users-msgs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1787 ;; The test for "two many" is because some people can't spell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1788 ;; I allow for up to two adjectives before "users".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1789 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1790 "\\b[Tt][wo]o many\\( +[^ \n]+\\)?\\( +[^ \n]+\\)? +users\\b\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1791 "\\btry back later\\b"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1792 ;; Regular expresion to match what servers output when there are too many
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1793 ;; anonymous logins. It is assumed that this is part of a 530 or 530- response
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1794 ;; to USER or PASS.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1795
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1796 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1797 ;;;; Buffer local FTP process variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1798 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1799
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1800 ;;; Variables buffer local to the process buffers are
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1801 ;;; named with the prefix efs-process-
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1802
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1803 (defvar efs-process-q nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1804 ;; List of functions to be performed asynch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1805 (make-variable-buffer-local 'efs-process-q)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1806
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1807 (defvar efs-process-cmd-waiting nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1808 ;; Set to t if a process has a synchronous cmd waiting to execute.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1809 ;; In this case, it will allow the synch. cmd to run before returning to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1810 ;; the cmd queue.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1811 (make-variable-buffer-local 'efs-process-cmd-waiting)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1812
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1813 (defvar efs-process-server-confused nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1814 (make-variable-buffer-local 'efs-process-server-confused)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1815
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1816 (defvar efs-process-cmd nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1817 ;; The command currently being executed, as a string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1818 (make-variable-buffer-local 'efs-process-cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1819
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1820 (defvar efs-process-xfer-size 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1821 (make-variable-buffer-local 'efs-process-xfer-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1822
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1823 (defvar efs-process-umask nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1824 ;; nil if the umask hash not been set
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1825 ;; an integer (the umask) if the umask has been set
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1826 (make-variable-buffer-local 'efs-process-umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1827
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1828 (defvar efs-process-idle-time nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1829 ;; If non-nil, the idle time of the server in seconds.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1830 (make-variable-buffer-local 'efs-process-idle-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1831
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1832 (defvar efs-process-busy nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1833 (make-variable-buffer-local 'efs-process-busy)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1834
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1835 (defvar efs-process-result-line "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1836 (make-variable-buffer-local 'efs-process-result-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1837
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1838 (defvar efs-process-result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1839 (make-variable-buffer-local 'efs-process-result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1840
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1841 (defvar efs-process-result-cont-lines "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1842 (make-variable-buffer-local 'efs-process-result-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1843
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1844 (defvar efs-process-msg "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1845 (make-variable-buffer-local 'efs-process-msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1846
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1847 (defvar efs-process-nowait nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1848 (make-variable-buffer-local 'efs-process-nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1849
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1850 (defvar efs-process-string "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1851 (make-variable-buffer-local 'efs-process-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1852
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1853 (defvar efs-process-continue nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1854 (make-variable-buffer-local 'efs-process-continue)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1855
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1856 (defvar efs-process-hash-mark-count 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1857 (make-variable-buffer-local 'efs-process-hash-mark-count)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1858
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1859 (defvar efs-process-hash-mark-unit nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1860 (make-variable-buffer-local 'efs-process-hash-mark-unit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1861
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1862 (defvar efs-process-last-percent -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1863 (make-variable-buffer-local 'efs-process-last-percent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1864
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1865 (defvar efs-process-host nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1866 (make-variable-buffer-local 'efs-process-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1867
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1868 (defvar efs-process-user nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1869 (make-variable-buffer-local 'efs-process-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1870
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1871 (defvar efs-process-host-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1872 ;; Holds the host-type as a string, for showing it on the mode line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1873 (make-variable-buffer-local 'efs-process-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1874
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1875 (defvar efs-process-xfer-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1876 ;; Set to one of 'ascii, 'ebcdic, 'image, 'tenex, or nil to indicate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1877 ;; the current setting of the transfer type for the connection. nil means
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1878 ;; that we don't know.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1879 (make-variable-buffer-local 'efs-process-xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1880
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1881 (defvar efs-process-client-altered-xfer-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1882 ;; Sometimes clients alter the xfer type, such as doing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1883 ;; an ls it is changed to ascii. If we are using quoted commands
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1884 ;; to do xfers the client doesn't get a chance to set it back.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1885 (make-variable-buffer-local 'efs-process-client-altered-xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1886
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1887 (defvar efs-process-prompt-regexp nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1888 ;; local value of prompt of FTP client.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1889 (make-variable-buffer-local 'efs-process-prompt-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1890
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1891 (defvar efs-process-cmd-counter 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1892 ;; Counts FTP commands, mod 16.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1893 (make-variable-buffer-local 'efs-process-cmd-counter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1894
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1895 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1896 ;;;; General Internal Variables.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1897 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1898
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1899 ;;; For the byte compiler
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1900 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1901 ;; These variables are usually unbound. We are just notifying the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1902 ;; byte compiler that we know what we are doing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1903
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1904 (defvar bv-length) ; getting file versions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1905 (defvar default-file-name-handler-alist) ; for file-name-handler-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1906 (defvar efs-completion-dir) ; for file name completion predicates
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1907 (defvar dired-directory) ; for default actions in interactive specs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1908 (defvar dired-local-variables-file) ; for inhibiting child look ups
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1909 (defvar dired-in-query) ; don't clobber dired queries with stat messages
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1910 (defvar after-load-alist) ; in case we're in emacs 18.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1911 (defvar comint-last-input-start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1912 (defvar comint-last-input-end)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1913 (defvar explicit-shell-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1914
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1915 ;;; fluid vars
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1916
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1917 (defvar efs-allow-child-lookup t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1918 ;; let-bind to nil, if want to inhibit child lookups.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1919
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1920 (defvar efs-nested-cmd nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1921 ;; let-bound to t, when a cmd is executed by a cont or pre-cont.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1922 ;; Such cmds will never end by looking at the next item in the queue,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1923 ;; if they are run synchronously, but rely on their calling function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1924 ;; to do this.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1925
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1926 ;;; polling ftp buffers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1927
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1928 (defvar efs-ftp-buffer-poll-time 300
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1929 "Period, in seconds, which efs will poll ftp buffers for activity.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1930 Used for expiring \(killing\) inactive ftp buffers.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1931
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1932 (defconst efs-ftp-buffer-alist nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1933 ;; alist of ftp buffers, and the total number of seconds that they
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1934 ;; have been idle.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1935
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1936 ;;; load extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1937
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1938 (defvar efs-load-lisp-extensions '(".elc" ".el" "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1939 "List of extensions to try when loading lisp files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1940
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1941 ;;; mode-line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1942
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1943 (defvar efs-mode-line-string "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1944 ;; Stores the string that efs displays on the mode line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1945
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1946 ;;; data & temporary buffers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1947
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1948 (defvar efs-data-buffer-name " *ftp data*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1949 ;; Buffer name to hold directory listing data received from ftp process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1950
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1951 (defvar efs-data-buffer-name-2 " *ftp data-2*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1952 ;; A second buffer name in which to hold directory listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1953 ;; Used for listings which are made during another directory listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1954
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1955 ;;; process names
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1956
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1957 (defvar efs-ctime-process-name-format "*efs ctime %s*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1958 ;; Passed to format with second arg the host name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1959
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1960 ;;; For temporary files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1961
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1962 ;; This is a list of symbols.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1963 (defconst efs-tmp-name-files ())
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1964 ;; Here is where these symbols live:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1965 (defconst efs-tmp-name-obarray (make-vector 7 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1966 ;; We put our version of the emacs PID here:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1967 (defvar efs-pid nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1968
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1969 ;;; For abort-recursive-edit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1970
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1971 (defvar efs-abort-recursive-edit-data nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1972 (defvar efs-abort-recursive-edit-delay 5)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1973 ;; Number of seconds after which efs-abort-recursive-edit-and-then
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1974 ;; will decide not to runs its sentinel. The assumption is that something
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1975 ;; went wrong.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1976
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1977 ;;; hashtables (Use defconst's to clobber any user silliness.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1978
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1979 (defconst efs-files-hashtable (efs-make-hashtable 97))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1980 ;; Hash table for storing directories and their respective files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1981
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1982 (defconst efs-expand-dir-hashtable (efs-make-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1983 ;; Hash table of tilde expansions for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1984
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1985 (defconst efs-ls-converter-hashtable (efs-make-hashtable 37))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1986 ;; Hashtable for storing functions to convert listings from one
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1987 ;; format to another. Keys are the required switches, and the values
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1988 ;; are alist of the form ((SWITCHES . CONVERTER)...) where is SWITCHES
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1989 ;; are the listing switches for the original listing, and CONVERTER is a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1990 ;; function of one-variable, the listing-type, to do the conversion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1991 ;; on data in the current buffer. SWITCHES is either a string, or nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1992 ;; nil means that the listing can be converted from cache in
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1993 ;; efs-files-hashtable, a string from cache in efs-ls-cache. For the latter,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1994 ;; listings with no switches (dumb listings), represent SWITCHES as a string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1995 ;; consisting only of the ASCII null character.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1996
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1997 ;;; cache variables (Use defconst's to clobber any user sillines.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1998
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
1999 (defconst efs-ls-cache nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2000 "List of results from efs-ls.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2001 Each entry is a list of four elements, the file listed, the switches used
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2002 \(nil if none\), the listing string, and whether this string has already been
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2003 parsed.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2004
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2005 (defvar efs-ls-uncache nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2006 ;; let-bind this to t, if you want to be sure that efs-ls will replace any
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2007 ;; cache entries.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2008
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2009 ;; This is a cache to see if the user has changed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2010 ;; completion-ignored-extensions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2011 (defconst efs-completion-ignored-extensions completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2012 "This variable is internal to efs. Do not set.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2013 See completion-ignored-extensions, instead.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2014
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2015 ;; We cache the regexp we use for completion-ignored-extensions. This
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2016 ;; saves building a string every time we do completion. String construction
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2017 ;; is costly in emacs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2018 (defconst efs-completion-ignored-pattern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2019 (mapconcat (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2020 (lambda (s) (if (stringp s)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2021 (concat (regexp-quote s) "$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2022 "/"))) ; / never in filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2023 efs-completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2024 "\\|")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2025 "This variable is internal to efs. Do not set.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2026 See completion-ignored-extensions, instead.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2027
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2028 (defvar efs-system-fqdn nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2029 "Cached value of the local systems' fully qualified domain name.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2030
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2031 ;;; The file-type-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2032
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2033 ;; efs-file-type-alist is an alist indexed by host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2034 ;; which stores data on how files are structured on the given
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2035 ;; host-type. Each entry is a list of three elements. The first is the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2036 ;; definition of a `byte', the second the native character representation,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2037 ;; and the third, the file structure.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2038 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2039 ;; Meanings of the symbols:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2040 ;; ------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2041 ;; The byte symbols:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2042 ;; 8-bit = bytes of 8-bits
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2043 ;; 36-bit-wa = 36-bit word aligned. Precisely, the addressing unit is that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2044 ;; of a PDP-10 using the "<440700,,0> byte pointer".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2045 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2046 ;; The native character set symbols:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2047 ;; 8-ascii = 8-bit NVT-ASCII
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2048 ;; 7-ascii = 7-bit ascii as on a PDP-10
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2049 ;; ebcdic = EBCDIC as on an IBM mainframe
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2050 ;; lispm = the native character set on a lispm (Symbolics and LMI)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2051 ;; mts = native character representation in the Michigan Terminal System
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2052 ;; (which runs on IBM and Amdal mainframes), similar to ebcdic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2053 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2054 ;; The file structure symbols:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2055 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2056 ;; file-nl = data is stored as a contiguous sequence of data bytes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2057 ;; with EOL denoted by <NL>.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2058 ;; file-crlf = data is stored as a contiguous sequence of data bytes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2059 ;; with EOL denoted by <CR-LF>
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2060 ;; record = data is stored as a sequence of records
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2061 ;; file-lispm = data as stored on a lispm. i.e. a sequence of bits
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2062 ;; with EOL denoted by character code 138 (?)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2063 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2064 ;; If we've messed anything up here, please let us know.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2065
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2066 (defvar efs-file-type-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2067 '((unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2068 (sysV-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2069 (bsd-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2070 (apollo-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2071 (dumb-apollo-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2072 (dumb-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2073 (super-dumb-unix . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2074 (guardian . (8-bit ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2075 (plan9 . (8-bit 8-ascii file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2076 (dos . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2077 (ms-unix . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2078 (netware . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2079 (os2 . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2080 (tops-20 . (36-bit-wa 7-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2081 (mpe . (8-bit 8-ascii record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2082 (mvs . (8-bit ebcdic record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2083 (cms . (8-bit ebcdic record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2084 (cms-knet . (8-bit ebcdic record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2085 (mts . (8-bit mts record)) ; mts seems to have its own char rep.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2086 ; Seems to be close to ebcdic, but not the same.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2087 (dos-distinct . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2088 (ka9q . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2089 (vms . (8-bit 8-ascii record)) ; The mysteries of VMS's RMS.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2090 (hell . (8-bit 8-ascii file-crlf))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2091 (vos . (8-bit 8-ascii record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2092 (ti-explorer . (8-bit lispm file-lispm)) ; lispms use a file structure, but
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2093 ; use an out of range char to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2094 ; indicate EOL.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2095 (ti-twenex . (8-bit lispm file-lispm))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2096 (nos-ve . (8-bit 8-ascii record))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2097 (coke . (8-bit 8-ascii file-nl)) ; only support 8-bit beverages
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2098 (nil . (8-bit 8-ascii file-nl)))) ; the local host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2099
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2100 ;;; Status messages
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2101
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2102 (defvar efs-last-message-time -86400) ; yesterday
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2103 ;; The time of the last efs status message. c.f. efs-message-interval
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2104
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2105 ;;; For handling dir listings
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2106
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2107 ;; This MUST match all the way to to the start of the filename.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2108 ;; This version corresponds to what dired now uses (sandy, 14.1.93)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2109 (defvar efs-month-and-time-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2110 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2111 " \\([0-9]+\\) +" ; file size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2112 "\\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|June?\\|July?\\|Aug\\|Sep\\|Oct"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2113 ; June and July are for HP-UX 9.0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2114 "\\|Nov\\|Dec\\) \\([ 0-3][0-9]\\)\\("
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2115 " [012][0-9]:[0-6][0-9] \\|" ; time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2116 " [12][90][0-9][0-9] \\|" ; year on IRIX, NeXT, SunOS, ULTRIX, Apollo
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2117 ; HP-UX, A/UX
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2118 " [12][90][0-9][0-9] \\)" ; year on AIX
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2119 ))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2120
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2121 (defvar efs-month-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2122 '(("Jan" . 1) ("Feb". 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2123 ("June" . 6) ("Jul" . 7) ("July" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2124 ("Nov" . 11) ("Dec" . 12)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2125
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2126 ;; Matches the file modes, link number, and owner string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2127 ;; The +/- is for extended file access permissions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2128 (defvar efs-modes-links-owner-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2129 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2130 "\\([^ ][-r][-w][^ ][-r][-w][^ ][-r][-w][^ ]\\)[-+]? *\\([0-9]+\\)"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2131 " +\\([^ ]+\\) "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2132
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2133 ;;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2134 ;;;; efs-dired variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2135 ;;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2136
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2137 ;; These variables must be here, instead of in efs-dired.el, because
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2138 ;; the efs-HOST-TYPE.el files need to add to it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2139 (defvar efs-dired-re-exe-alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2140 "Association list of regexps which match file lines of executable files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2141
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2142 (defvar efs-dired-re-dir-alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2143 "Association list of regexps which match file lines of subdirectories.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2144
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2145 (defvar efs-dired-host-type nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2146 "Host type of a dired buffer. \(buffer local\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2147 (make-variable-buffer-local 'efs-dired-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2148
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2149 (defvar efs-dired-listing-type nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2150 "Listing type of a dired buffer. \(buffer local\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2151 (make-variable-buffer-local 'efs-dired-listing-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2152
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2153 (defvar efs-dired-listing-type-string nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2154 (make-variable-buffer-local 'efs-dired-listing-type-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2155
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2156 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2157 ;;;; New error symbols.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2158 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2159
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2160 (put 'ftp-error 'error-conditions '(ftp-error file-error error))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2161 ;; (put 'ftp-error 'error-message "FTP error")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2162
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2163
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2164 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2165 ;;;; >3
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2166 ;;;; Utilities
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2167 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2168
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2169 ;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2170 ;;; General Macros (Make sure that macros are defined before they're
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2171 ;;; used, for the byte compiler.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2172 ;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2173
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2174 (defmacro efs-kbd-quit-protect (proc &rest body)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2175 ;; When an efs function controlling an FTP connection gets a kbd-quit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2176 ;; this tries to make sure that everything unwinds consistently.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2177 (let ((temp (make-symbol "continue")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2178 (list 'let
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2179 (list '(quit-flag nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2180 '(inhibit-quit nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2181 (list temp t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2182 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2183 'while temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2184 (list 'setq temp nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2185 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2186 'condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2187 (cons 'progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2188 body)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2189 (list 'quit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2190 (list 'setq temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2191 (list 'efs-kbd-quit-protect-cover-quit proc))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2192
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2193 (defun efs-kbd-quit-protect-cover-quit (proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2194 ;; This function exists to keep the macro expansion of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2195 ;; efs-kbd-quit-protect down to a reasonable size.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2196 (let ((pop-up-windows t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2197 (buff (get-buffer (process-buffer proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2198 res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2199 (if (save-window-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2200 (if buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2201 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2202 (pop-to-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2203 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2204 (recenter (- (window-height)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2205 2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2206 (setq res (efs-kill-ftp-buffer-with-prompt proc buff)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2207 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2208 (if (eq res 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2209 (if (eq (selected-window)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2210 (minibuffer-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2211 (efs-abort-recursive-edit-and-then
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2212 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2213 (lambda (buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2214 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2215 (display-buffer buff))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2216 buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2217 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2218 (display-buffer buff))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2219 (signal 'quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2220 (if (eq (selected-window) (minibuffer-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2221 (abort-recursive-edit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2222 (signal (quote quit) nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2223 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2224 (sit-for 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2225 (message "Waiting on %s..." (or (car (efs-parse-proc-name proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2226 "a whim"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2227 t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2228
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2229 (put 'efs-kbd-quit-protect 'lisp-indent-hook 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2230
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2231 (defmacro efs-save-buffer-excursion (&rest forms)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2232 "Execute FORMS, restoring the current buffer afterwards.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2233 Unlike, save-excursion, this does not restore the point."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2234 (let ((temp (make-symbol "saved-buff")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2235 (list 'let
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2236 (list (list temp '(current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2237 (list 'unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2238 (cons 'progn forms)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2239 (list 'condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2240 (list 'set-buffer temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2241 '(error nil))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2242
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2243 (put 'efs-save-buffer-excursion 'lisp-indent-hook 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2244
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2245 (defmacro efs-unquote-dollars (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2246 ;; Unquote $$'s to $'s in STRING.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2247 (` (let ((string (, string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2248 (start 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2249 new)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2250 (while (string-match "\\$\\$" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2251 (setq new (concat new (substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2252 string start (1+ (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2253 start (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2254 (if new
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2255 (concat new (substring string start))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2256 string))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2257
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2258 (defmacro efs-get-file-part (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2259 ;; Given PATH, return the file part used for looking up the file's entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2260 ;; in a hashtable.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2261 ;; This need not be the same thing as file-name-nondirectory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2262 (` (let ((file (file-name-nondirectory (, path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2263 (if (string-equal file "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2264 "."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2265 file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2266
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2267 (defmacro efs-ftp-path-macro (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2268 ;; Just a macro version of efs-ftp-path, for speed critical
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2269 ;; situations. Could use (inline ...) instead, but not everybody
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2270 ;; uses the V19 byte-compiler. Also, doesn't call efs-save-match-data,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2271 ;; but assumes that the calling function does it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2272 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2273 (let ((path (, path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2274 (or (string-equal path efs-ftp-path-arg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2275 (setq efs-ftp-path-res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2276 (and (string-match efs-path-regexp path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2277 (let ((host (substring path (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2278 (match-end 2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2279 (user (and (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2280 (substring path (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2281 (1- (match-end 1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2282 (rpath (substring path (1+ (match-end 2)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2283 (list (if (string-equal host "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2284 (setq host (system-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2285 host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2286 (or user (efs-get-user host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2287 rpath)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2288 ;; Set this last, in case efs-get-user calls this function,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2289 ;; which would modify an earlier setting.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2290 efs-ftp-path-arg path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2291 efs-ftp-path-res)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2292
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2293 (defmacro efs-canonize-switches (switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2294 ;; Converts a switches string, into a lexographically ordered string,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2295 ;; omitting - and spaces. Should we remove duplicate characters too?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2296 (` (if (, switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2297 (mapconcat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2298 'char-to-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2299 (sort (delq ?- (delq ?\ (mapcar 'identity (, switches)))) '<) "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2300 ;; For the purpose of interning in a hashtable, represent the nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2301 ;; switches, as a string consisting of the ascii null character.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2302 (char-to-string 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2303
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2304 (defmacro efs-canonize-file-name (fn)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2305 ;; Canonizes the case of file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2306 (` (let ((parsed (efs-ftp-path (, fn))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2307 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2308 (let ((host (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2309 (if (memq (efs-host-type host) efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2310 (downcase (, fn))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2311 (format efs-path-format-string (nth 1 parsed) (downcase host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2312 (nth 2 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2313 (, fn)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2314
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2315 (defmacro efs-get-files-hashtable-entry (fn)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2316 (` (efs-get-hash-entry (efs-canonize-file-name (, fn)) efs-files-hashtable)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2317
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2318 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2319 ;;;; Utility Functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2320 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2321
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2322 (defun efs-kill-ftp-buffer-with-prompt (proc buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2323 ;; Does a 3-way prompt to kill a ftp PROC and BUFFER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2324 ;; Returns t if buffer was killed, 0 if only process, nil otherwise.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2325 (let ((inhibit-quit t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2326 (cursor-in-echo-area t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2327 char)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2328 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2329 (if efs-debug-ftp-connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2330 "Kill ftp process and buffer (y[es], n[o], c[lose], d[ebug] ) "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2331 "Kill ftp process and buffer? (y or n, c to only close process) "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2332 (setq char (read-char))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2333 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2334 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2335 ((memq char '(?y ?Y ?\ ))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2336 (set-process-sentinel proc nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2337 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2338 (kill-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2339 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2340 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2341 ((memq char '(?c ?C))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2342 (set-process-sentinel proc nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2343 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2344 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2345 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2346 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2347 efs-process-q nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2348 (delete-process proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2349 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2350 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2351 ((memq char '(?n ?N))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2352 (message "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2353 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2354 ((and efs-debug-ftp-connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2355 (memq char '(?d ?D)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2356 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2357 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2358 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2359 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2360 efs-process-q nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2361 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2362 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2363 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2364 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2365 (if efs-debug-ftp-connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2366 "Type one of y, n, c or d."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2367 "Type one of y, n or c."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2368 (ding)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2369 (sit-for 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2370 (setq quit-flag nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2371 (efs-kill-ftp-buffer-with-prompt proc buffer))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2372
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2373 (defun efs-barf-if-not-directory (directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2374 ;; Signal an error if DIRECTORY is not one.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2375 (or (file-directory-p directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2376 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2377 (list "Opening directory"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2378 (if (file-exists-p directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2379 "not a directory"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2380 "no such file or directory")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2381 directory))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2382
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2383 (defun efs-call-cont (cont &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2384 "Call the function specified by CONT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2385 CONT can be either a function or a list of a function and some args.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2386 The first parameters passed to the function will be ARGS. The remaining
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2387 args will be taken from CONT if a list was passed."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2388 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2389 (let ((efs-nested-cmd t)) ; let-bound so that conts don't pop any queues
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2390 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2391 (if (and (listp cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2392 (not (eq (car cont) 'lambda)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2393 (apply (car cont) (append args (cdr cont)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2394 (apply cont args))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2395
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2396 (defun efs-replace-path-component (fullpath path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2397 "For FULLPATH matching efs-path-regexp replace the path component with PATH."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2398 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2399 (if (string-match efs-path-root-regexp fullpath)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2400 (concat (substring fullpath 0 (match-end 0)) path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2401 path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2402
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2403 (defun efs-abort-recursive-edit-and-then (fun &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2404 ;; Does an abort-recursive-edit, and runs fun _after_ emacs returns to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2405 ;; top level.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2406 (if (get-process "efs-abort-recursive-edit")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2407 ;; Don't queue these things. Clean them out.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2408 (delete-process "efs-abort-recursive-edit"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2409 (or efs-suppress-abort-recursive-edit-and-then
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2410 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2411 (setq efs-abort-recursive-edit-data (cons (nth 1 (current-time))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2412 (cons fun args)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2413 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2414 (set-process-sentinel
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2415 (let ((default-directory exec-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2416 (process-connection-type nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2417 (start-process "efs-abort-recursive-edit" nil "sleep" "0"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2418 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2419 (lambda (proc string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2420 (let ((data efs-abort-recursive-edit-data))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2421 (setq efs-abort-recursive-edit-data)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2422 (if (and data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2423 (integerp (car data))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2424 (<= (- (nth 1 (current-time)) (car data))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2425 efs-abort-recursive-edit-delay))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2426 (apply (nth 1 data) (nthcdr 2 data)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2427 (error nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2428 (abort-recursive-edit))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2429
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2430 (defun efs-occur-in-string (char string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2431 ;; Return the number of occurrences of CHAR in STRING.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2432 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2433 (let ((regexp (regexp-quote (char-to-string char)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2434 (count 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2435 (start 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2436 (while (string-match regexp string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2437 (setq start (match-end 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2438 count (1+ count)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2439 count)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2440
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2441 (defun efs-parse-proc-name (proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2442 ;; Parses the name of process to return a list \(host user\).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2443 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2444 (let ((name (process-name proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2445 (and name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2446 (string-match "^\\*ftp \\([^@]*\\)@\\([^*]+\\)\\*$" name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2447 (list (substring name (match-beginning 2) (match-end 2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2448 (substring name (match-beginning 1) (match-end 1)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2449
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2450 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2451 ;;;; Of Geography, connectivity, and the internet... Gateways.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2452 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2453
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2454 (defun efs-use-gateway-p (host &optional opaque-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2455 ;; Returns whether to access this host via a gateway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2456 ;; Returns the gateway type as a symbol. See efs-gateway-type <V>.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2457 ;; If optional OPAQUE-P is non-nil, only returns non-nil if the gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2458 ;; type is in the list efs-opaque-gateways <V>.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2459 (and efs-gateway-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2460 host ;local host is nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2461 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2462 (and (not (string-match efs-ftp-local-host-regexp host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2463 (let ((type (car efs-gateway-type)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2464 (if opaque-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2465 (and (memq type efs-opaque-gateways) type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2466 type))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2467
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2468 (defun efs-local-to-gateway-filename (filename &optional reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2469 ;; Converts a FILENAME on the local host to its name on the gateway,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2470 ;; using efs-gateway-mounted-dirs-alist. If REVERSE is non-nil, does just
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2471 ;; that. If the there is no corresponding name because non of its parent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2472 ;; directories are mounted, returns nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2473 (if efs-gateway-mounted-dirs-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2474 (let ((len (length filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2475 (alist efs-gateway-mounted-dirs-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2476 result elt elt-len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2477 (if reverse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2478 (while (setq elt (car alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2479 (if (and (>= len (setq elt-len (length (cdr elt))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2480 (string-equal (cdr elt) (substring filename 0 elt-len)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2481 (setq result (concat (car elt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2482 (substring filename elt-len))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2483 alist nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2484 (setq alist (cdr alist))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2485 (while (setq elt (car alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2486 (if (and (>= len (setq elt-len (length (car elt))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2487 (string-equal (car elt) (substring filename 0 elt-len)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2488 (setq result (concat (cdr elt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2489 (substring filename elt-len))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2490 alist nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2491 (setq alist (cdr alist)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2492 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2493
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2494 ;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2495 ;;; Enhanced message support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2496 ;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2497
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2498 (defun efs-message (fmt &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2499 "Output the given message, truncating to the size of the minibuffer window."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2500 (let ((msg (apply (function format) fmt args))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2501 (max (window-width (minibuffer-window))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2502 (if (>= (length msg) max)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2503 (setq msg (concat "> " (substring msg (- 3 max)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2504 (message "%s" msg)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2505
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2506 (defun efs-message-p ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2507 ;; Returns t, if efs is allowed to display a status message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2508 (not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2509 (or (and (boundp 'dired-in-query) dired-in-query)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2510 (boundp 'search-message)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2511 cursor-in-echo-area
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2512 (and (/= efs-message-interval 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2513 (let ((diff (- efs-last-message-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2514 (setq efs-last-message-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2515 (nth 1 (current-time))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2516 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2517 (> diff (- efs-message-interval))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2518 (< diff 0))))))) ; in case the clock wraps.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2519
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2520 (efs-define-fun efs-relativize-filename (file &optional dir new)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2521 "Abbreviate the given filename relative to DIR .
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2522 If DIR is nil, use the value of `default-directory' for the currently selected
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2523 window. If the optional parameter NEW is given and the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2524 non-directory parts match, only return the directory part of the file."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2525 (let* ((dir (or dir (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2526 (set-buffer (window-buffer (selected-window)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2527 default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2528 (dlen (length dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2529 (result file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2530 (and (> (length file) dlen)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2531 (string-equal (substring file 0 dlen) dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2532 (setq result (substring file dlen)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2533 (and new
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2534 (string-equal (file-name-nondirectory result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2535 (file-name-nondirectory new))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2536 (or (setq result (file-name-directory result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2537 (setq result "./")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2538 (abbreviate-file-name result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2539
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2540 ;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2541 ;;; Temporary file location and deletion...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2542 ;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2543
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2544 (defun efs-get-pid ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2545 ;; Half-hearted attempt to get the current process's id.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2546 (setq efs-pid (substring (make-temp-name "") 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2547
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2548 (defun efs-make-tmp-name (host1 host2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2549 ;; Returns the name of a new temp file, for moving data between HOST1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2550 ;; and HOST2. This temp file must be directly accessible to the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2551 ;; FTP client connected to HOST1. Using nil for either HOST1 or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2552 ;; HOST2 means the local host. The return value is actually a list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2553 ;; whose car is the name of the temp file wrto to the local host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2554 ;; and whose cdr is the name of the temp file wrto to the host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2555 ;; on which the client connected to HOST1 is running. If the gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2556 ;; is only accessible by FTP, then the car of this may be in efs extended
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2557 ;; file name syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2558 (let ((pid (or efs-pid (efs-get-pid)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2559 (start ?a)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2560 file entry template rem-template template-len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2561 ;; Compute the templates.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2562 (if (null (and host1 (efs-use-gateway-p host1 t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2563 ;; file must be local
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2564 (if (null (and host2 (efs-use-gateway-p host2 t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2565 (setq template efs-tmp-name-template)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2566 (setq template (or (efs-local-to-gateway-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2567 efs-gateway-tmp-name-template t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2568 efs-tmp-name-template)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2569 ;; file must be on the gateway -- make sure that the gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2570 ;; configuration is sensible.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2571 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2572 (or (string-match efs-ftp-local-host-regexp efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2573 (error "Gateway %s must be directly ftp accessible."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2574 efs-gateway-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2575 (setq rem-template efs-gateway-tmp-name-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2576 template (or (efs-local-to-gateway-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2577 efs-gateway-tmp-name-template t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2578 (format efs-path-format-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2579 (efs-get-user efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2580 efs-gateway-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2581 efs-gateway-tmp-name-template))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2582 template-len (length template)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2583 ;; Compute a new file name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2584 (while (let (efs-verbose)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2585 (setq file (format "%s%c%s" template start pid)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2586 entry (intern file efs-tmp-name-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2587 (or (memq entry efs-tmp-name-files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2588 (file-exists-p file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2589 (if (> (setq start (1+ start)) ?z)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2590 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2591 (setq template (concat template "X"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2592 (setq start ?a))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2593 (setq efs-tmp-name-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2594 (cons entry efs-tmp-name-files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2595 (if rem-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2596 (cons file (concat rem-template (substring file template-len)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2597 (cons file file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2598
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2599 (defun efs-del-tmp-name (temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2600 ;; Deletes file TEMP, a string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2601 (setq efs-tmp-name-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2602 (delq (intern temp efs-tmp-name-obarray)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2603 efs-tmp-name-files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2604 (condition-case ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2605 (let (efs-verbose)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2606 (delete-file temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2607 (error nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2608
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2609
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2610 ;;;; ==============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2611 ;;;; >4
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2612 ;;;; Hosts, Users, Accounts, and Passwords
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2613 ;;;; ==============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2614 ;;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2615 ;;; A lot of the support for this type of thing is in efs-netrc.el.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2616
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2617 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2618 ;;;; Password support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2619 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2620
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2621 (defun efs-lookup-passwd (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2622 ;; Look up the password for HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2623 (let ((ent (efs-get-host-user-property host user 'passwd)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2624 (and ent (efs-code-string ent))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2625
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2626 (defun efs-system-fqdn ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2627 "Returns a fully qualified domain name for the current host, if possible."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2628 (or efs-system-fqdn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2629 (setq efs-system-fqdn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2630 (let ((sys (system-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2631 (if (string-match "\\." sys)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2632 sys
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2633 (if efs-nslookup-program
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2634 (let ((proc (let ((default-directory exec-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2635 (process-connection-type nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2636 (start-process " *nslookup*" " *nslookup*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2637 efs-nslookup-program sys)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2638 (res sys)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2639 (n 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2640 (process-kill-without-query proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2641 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2642 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2643 (let ((quit-flag nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2644 (inhibit-quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2645 (if efs-nslookup-threshold
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2646 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2647 (while (and (memq (process-status proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2648 '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2649 (< n efs-nslookup-threshold))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2650 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2651 (setq n (1+ n)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2652 (if (>= n efs-nslookup-threshold)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2653 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2654 (with-output-to-temp-buffer "*Help*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2655 (princ (format "\
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2656 efs is unable to determine a fully qualified domain name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2657 for the local host to send as an anonymous ftp password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2658
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2659 The function `system-name' is not returning a fully qualified
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2660 domain name. An attempt to obtain a fully qualified domain name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2661 with `efs-nslookup-program' (currently set to \"%s\") has
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2662 elicited no response from that program. Consider setting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2663 `efs-generate-anonymous-password' to an email address for anonymous
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2664 ftp passwords.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2665
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2666 For more information see the documentation (use C-h v) for the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2667 variables `efs-nslookup-program' and `efs-nslookup-threshold'."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2668 efs-nslookup-program)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2669 (error "No response from %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2670 efs-nslookup-program))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2671 (while (memq (process-status proc) '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2672 (accept-process-output proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2673 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2674 (if (re-search-forward
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2675 (format "^Name: *\\(%s\\.[^ \n\t]+\\)"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2676 sys) nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2677 (setq res (buffer-substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2678 (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2679 (match-end 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2680 (kill-buffer (current-buffer)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2681 res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2682 sys))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2683
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2684 (defun efs-passwd-unique-list (alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2685 ;; Preserving the relative order of ALIST, remove all entries with duplicate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2686 ;; cars.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2687 (let (result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2688 (while alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2689 (or (assoc (car alist) result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2690 (setq result (cons (car alist) result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2691 (setq alist (cdr alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2692 (nreverse result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2693
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2694 (defun efs-get-passwd-list (user host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2695 ;; Returns an alist of the form '((pass host user) ...).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2696 ;; The order is essentially arbitrary, except that entries with user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2697 ;; equal to USER will appear first. Followed by entries with host equal to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2698 ;; HOST. Also, there will be no entries with duplicate values of pass.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2699 (efs-parse-netrc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2700 (let* ((user-template (concat "/" user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2701 (ulen (length user-template))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2702 (hlen (length host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2703 primaries secondaries tertiaries)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2704 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2705 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2706 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2707 (lambda (key passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2708 (cond ((null passwd) nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2709 ((and (> (length key) ulen)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2710 (string-equal user-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2711 (substring key (- ulen))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2712 (setq primaries (cons (list (efs-code-string passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2713 (substring key 0 (- ulen))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2714 (substring user-template 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2715 primaries)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2716 ((and (> (length key) hlen)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2717 (string-equal host (substring key 0 hlen))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2718 (memq (aref key hlen) '(?/ ?.)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2719 (if (string-match "/" key hlen)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2720 (setq secondaries
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2721 (cons (list (efs-code-string passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2722 (substring key 0 (match-beginning 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2723 (substring key (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2724 secondaries))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2725 ((string-match "/" key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2726 (setq tertiaries
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2727 (cons (list (efs-code-string passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2728 (substring key 0 (match-beginning 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2729 (substring key (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2730 tertiaries))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2731 efs-host-user-hashtable 'passwd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2732 (efs-passwd-unique-list (nconc primaries secondaries tertiaries))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2733
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2734 (defun efs-get-passwd (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2735 "Given a HOST and USER, return the FTP password, prompting if it was not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2736 previously set."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2737 (efs-parse-netrc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2738
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2739 ;; look up password in the hash table first; user might have overriden the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2740 ;; defaults.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2741 (cond ((efs-lookup-passwd host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2742
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2743 ;; see if default user and password set from the .netrc file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2744 ((and (stringp efs-default-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2745 efs-default-password
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2746 (string-equal user efs-default-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2747 (copy-sequence efs-default-password))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2748
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2749 ;; anonymous ftp password is handled specially since there is an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2750 ;; unwritten rule about how that is used on the Internet.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2751 ((and (efs-anonymous-p user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2752 efs-generate-anonymous-password)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2753 (if (stringp efs-generate-anonymous-password)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2754 (copy-sequence efs-generate-anonymous-password)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2755 (concat (user-login-name) "@" (efs-system-fqdn))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2756
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2757 ;; see if same user has logged in to other hosts; if so then prompt
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2758 ;; with the password that was used there.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2759 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2760 (let (others defaults passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2761 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2762 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2763 (setq others (efs-get-passwd-list user host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2764 defaults (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2765 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2766 (lambda (x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2767 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2768 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2769 "Passwd for %s@%s (same as %s@%s): "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2770 user host (nth 2 x) (nth 1 x))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2771 (car x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2772 others))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2773 (setq passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2774 (read-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2775 (or defaults
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2776 (format "Password for %s@%s: " user host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2777 (while others
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2778 (fillarray (car (car others)) 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2779 (setq others (cdr others))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2780 (or (null passwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2781 (and efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2782 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2783 (string-match efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2784 (format "%s@%s" user host))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2785 (efs-set-passwd host user passwd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2786 passwd))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2787
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2788 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2789 ;;;; Account support
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2790 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2791
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2792 (defun efs-get-account (host user &optional minidisk really)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2793 "Given a HOST, USER, and optional MINIDISK return the FTP account password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2794 If the optional REALLY argument is given, prompts the user if it can't find
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2795 one."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2796 (efs-parse-netrc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2797 (let ((account (if minidisk
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2798 (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2799 (concat (downcase host) "/" user "/" minidisk)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2800 efs-minidisk-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2801 (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2802 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2803 (efs-get-host-user-property host user 'account))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2804 (if account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2805 (efs-code-string account)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2806 ;; Do we really want to send the default-account passwd for all
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2807 ;; minidisks?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2808 (if (and (stringp efs-default-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2809 (string-equal user efs-default-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2810 efs-default-account)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2811 efs-default-account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2812 (and really
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2813 (let ((acct
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2814 (read-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2815 (if minidisk
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2816 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2817 "Write access password for minidisk %s on %s@%s: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2818 minidisk user host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2819 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2820 "Account password for %s@%s: " user host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2821 (or (and efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2822 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2823 efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2824 (format "%s@%s" user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2825 (efs-set-account host user minidisk acct))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2826 acct))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2827
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2828 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2829 ;;;; Special classes of users.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2830 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2831
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2832 (defun efs-anonymous-p (user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2833 ;; Returns t if USER should be treated as an anonymous FTP login.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2834 (let ((user (downcase user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2835 (or (string-equal user "anonymous") (string-equal user "ftp"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2836
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2837
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2838 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2839 ;;;; >5
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2840 ;;;; FTP client process, and server responses
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2841 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2842
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2843 ;;;; ---------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2844 ;;;; Support for asynch process queues.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2845 ;;;; ---------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2846
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2847 (defun efs-add-to-queue (host user item)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2848 "To the end of the command queue for HOST and USER, adds ITEM.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2849 Does nothing if there is no process buffer for HOST and USER."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2850 (let ((buff (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2851 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2852 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2853 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2854 (setq efs-process-q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2855 (nconc efs-process-q (list item)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2856
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2857 ;;;; -------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2858 ;;;; Error recovery for the process filter.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2859 ;;;; -------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2860
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2861 ;;; Could make this better, but it's such an unlikely error to hit.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2862 (defun efs-process-scream-and-yell (line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2863 (let* ((buff (buffer-name (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2864 (host (and (string-match "@\\(.*\\)\\*$" buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2865 (substring buff (match-beginning 1) (match-end 1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2866 (with-output-to-temp-buffer "*Help*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2867 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2868 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2869 "efs is unable to identify the following reply code
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2870 from the ftp server " host ":\n\n" line "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2871
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2872 Please send a bug report to ange@hplb.hpl.hp.com.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2873 In your report include a transcript of your\n"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2874 buff " buffer."))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2875 (error "Unable to identify server code."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2876
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2877 (defun efs-error (host user msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2878 "Signal \'ftp-error for the FTP connection for HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2879 The error gives the string MSG as text. The process buffer for the FTP
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2880 is popped up in another window."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2881 (let ((cur (selected-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2882 (pop-up-windows t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2883 (buff (get-buffer (efs-ftp-process-buffer host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2884 (if buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2885 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2886 (pop-to-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2887 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2888 (select-window cur))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2889 (signal 'ftp-error (list (format "FTP Error: %s" msg))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2890
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2891 ;;;; --------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2892 ;;;; Process filter and supporting functions for handling FTP codes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2893 ;;;; --------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2894
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2895 (defun efs-process-handle-line (line proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2896 ;; Look at the given LINE from the ftp process PROC and try to catagorize it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2897 (cond ((string-match efs-xfer-size-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2898 (let ((n 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2899 ;; this loop will bomb with an args out of range error at 10
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2900 (while (not (match-beginning n))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2901 (setq n (1+ n)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2902 (setq efs-process-xfer-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2903 (ash (string-to-int (substring line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2904 (match-beginning n)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2905 (match-end n)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2906 -10))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2907
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2908 ((string-match efs-multi-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2909 (setq efs-process-result-cont-lines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2910 (concat efs-process-result-cont-lines line "\n")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2911
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2912 ((string-match efs-skip-msgs line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2913
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2914 ((string-match efs-cmd-ok-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2915 (if (string-match efs-cmd-ok-cmds efs-process-cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2916 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2917 efs-process-result nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2918 efs-process-result-line line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2919
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2920 ((string-match efs-pending-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2921 (if (string-match "^quote rnfr " efs-process-cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2922 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2923 efs-process-result nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2924 efs-process-result-line line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2925
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2926 ((string-match efs-bytes-received-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2927 (if efs-process-server-confused
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2928 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2929 efs-process-result nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2930 efs-process-result-line line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2931
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2932 ((string-match efs-server-confused-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2933 (setq efs-process-server-confused t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2934
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2935 ((string-match efs-good-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2936 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2937 efs-process-result nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2938 efs-process-result-line line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2939
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2940 ((string-match efs-fatal-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2941 (set-process-sentinel proc nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2942 (delete-process proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2943 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2944 efs-process-result 'fatal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2945 efs-process-result-line line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2946
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2947 ((string-match efs-failed-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2948 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2949 efs-process-result 'failed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2950 efs-process-result-line line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2951
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2952 ((string-match efs-unknown-response-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2953 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2954 efs-process-result 'weird
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2955 efs-process-result-line line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2956 (efs-process-scream-and-yell line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2957
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2958 (efs-define-fun efs-process-log-string (proc str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2959 ;; For a given PROCESS, log the given STRING at the end of its
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2960 ;; associated buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2961 (let ((buff (get-buffer (process-buffer proc))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2962 (if buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2963 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2964 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2965 (comint-output-filter proc str)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2966
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2967 (defun efs-process-filter (proc str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2968 ;; Build up a complete line of output from the ftp PROCESS and pass it
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2969 ;; on to efs-process-handle-line to deal with.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2970 (let ((inhibit-quit t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2971 (buffer (get-buffer (process-buffer proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2972 (efs-default-directory default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2973
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2974 ;; see if the buffer is still around... it could have been deleted.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2975 (if buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2976 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2977 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2978 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2979
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2980 ;; handle hash mark printing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2981 (if efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2982 (setq str (efs-process-handle-hash str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2983 efs-process-string (concat efs-process-string str)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2984 (efs-process-log-string proc str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2985 (while (and efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2986 (string-match "\n" efs-process-string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2987 (let ((line (substring efs-process-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2988 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2989 (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2990 (setq efs-process-string (substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2991 efs-process-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2992 (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2993 ;; If we are in synch with the client, we should
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2994 ;; never get prompts in the wrong place. Just to be safe,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2995 ;; chew them off.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2996 (while (string-match efs-process-prompt-regexp line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2997 (setq line (substring line (match-end 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2998 (efs-process-handle-line line proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
2999
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3000 ;; has the ftp client finished? if so then do some clean-up
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3001 ;; actions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3002 (if (not efs-process-busy)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3003 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3004 (efs-correct-hash-mark-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3005 ;; reset process-kill-without-query
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3006 (process-kill-without-query proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3007 ;; issue the "done" message since we've finished.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3008 (if (and efs-process-msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3009 (efs-message-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3010 (null efs-process-result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3011 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3012
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3013 (efs-message "%s...done" efs-process-msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3014 (setq efs-process-msg nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3015
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3016 (if (and efs-process-nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3017 (null efs-process-cmd-waiting))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3018
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3019 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3020 ;; Is there a continuation we should be calling?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3021 ;; If so, we'd better call it, making sure we
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3022 ;; only call it once.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3023 (if efs-process-continue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3024 (let ((cont efs-process-continue))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3025 (setq efs-process-continue nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3026 (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3027 cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3028 efs-process-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3029 efs-process-result-line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3030 efs-process-result-cont-lines)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3031 ;; If the cmd was run asynch, run the next
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3032 ;; cmd from the queue. For synch cmds, this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3033 ;; is done by efs-send-cmd. For asynch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3034 ;; cmds we don't care about
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3035 ;; efs-nested-cmd, since nothing is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3036 ;; waiting for the cmd to complete. If
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3037 ;; efs-process-cmd-waiting is t, exit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3038 ;; to let this command run.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3039 (if (and efs-process-q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3040 ;; Be careful to check efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3041 ;; again, because the cont may have started
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3042 ;; some new ftp action.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3043 ;; wheels within wheels...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3044 (null efs-process-busy))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3045 (let ((next (car efs-process-q)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3046 (setq efs-process-q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3047 (cdr efs-process-q))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3048 (apply 'efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3049 efs-process-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3050 efs-process-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3051 next))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3052
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3053 (if efs-process-continue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3054 (let ((cont efs-process-continue))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3055 (setq efs-process-continue nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3056 (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3057 cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3058 efs-process-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3059 efs-process-result-line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3060 efs-process-result-cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3061
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3062 ;; Update the mode line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3063 ;; We can't test nowait to see if we changed the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3064 ;; modeline in the first place, because conts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3065 ;; may be running now, which will confuse the issue.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3066 ;; The logic is simpler if we update the modeline
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3067 ;; before the cont, but then the user sees the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3068 ;; modeline track the cont execution. It's dizzying.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3069 (if (and (or efs-mode-line-format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3070 efs-ftp-activity-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3071 (null efs-process-busy))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3072 (efs-update-mode-line)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3073
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3074 ;; Trim buffer, if required.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3075 (and efs-max-ftp-buffer-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3076 (zerop efs-process-cmd-counter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3077 (> (point-max) efs-max-ftp-buffer-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3078 (= (point-min) 1) ; who knows, the user may have narrowed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3079 (null (get-buffer-window (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3080 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3081 (goto-char (/ efs-max-ftp-buffer-size 2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3082 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3083 (delete-region (point-min) (point))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3084
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3085 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3086 ;;;; Functions for counting hashes and reporting on bytes transferred.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3087 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3088
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3089 (defun efs-set-xfer-size (host user bytes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3090 ;; Set the size of the next FTP transfer in bytes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3091 (let ((proc (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3092 (if proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3093 (let ((buf (process-buffer proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3094 (if buf
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3095 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3096 (set-buffer buf)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3097 (setq efs-process-xfer-size (ash bytes -10))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3098
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3099 (defun efs-guess-incoming-bin-hm-size ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3100 ;; Guess at the hash mark size for incoming binary transfers by taking
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3101 ;; the average value for such transfers to other hosts.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3102 (let ((total 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3103 (n 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3104 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3105 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3106 (lambda (host hm-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3107 (if hm-size (setq total (+ total hm-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3108 n (1+ n)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3109 efs-host-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3110 'incoming-bin-hm-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3111 (and (> n 0) (/ total n))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3112
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3113 (defun efs-set-hash-mark-unit (host user &optional incoming)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3114 ;; Sets the value of efs-process-hash-mark-unit according to the xfer-type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3115 ;; efs-hash-mark-unit is the number of bytes represented by a hash mark,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3116 ;; in units of 16. If INCOMING is non-nil, the xfer will be a GET.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3117 (if efs-send-hash
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3118 (let ((buff (efs-ftp-process-buffer host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3119 (gate-p (efs-use-gateway-p host t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3120 (if buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3121 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3122 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3123 (setq efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3124 (ash (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3125 (and incoming (eq efs-process-xfer-type 'image)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3126 (or (efs-get-host-property
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3127 host 'incoming-bin-hm-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3128 (if gate-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3129 efs-gateway-incoming-binary-hm-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3130 efs-incoming-binary-hm-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3131 (let ((guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3132 (efs-guess-incoming-bin-hm-size)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3133 (and guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3134 (efs-set-host-property
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3135 host 'incoming-bin-hm-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3136 guess)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3137 (if gate-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3138 efs-gateway-hash-mark-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3139 efs-hash-mark-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3140 1024) ; make sure that we have some integer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3141 -4)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3142
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3143 (defun efs-correct-hash-mark-size ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3144 ;; Corrects the value of efs-{ascii,binary}-hash-mark-size.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3145 ;; Must be run in the process buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3146 (and efs-send-hash
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3147 efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3148 (> efs-process-xfer-size 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3149 (< efs-process-xfer-size 524288) ; 2^19, prevent overflows
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3150 (> efs-process-hash-mark-count 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3151 (or (> efs-process-last-percent 100)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3152 (< (ash (* efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3153 (1+ efs-process-hash-mark-count )) -6)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3154 efs-process-xfer-size))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3155 (let ((val (ash (/ (ash efs-process-xfer-size 6)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3156 efs-process-hash-mark-count) 4)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3157 (if (and (eq efs-process-xfer-type 'image)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3158 (>= (length efs-process-cmd) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3159 (string-equal (downcase (substring efs-process-cmd 0 4))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3160 "get "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3161 (efs-set-host-property efs-process-host 'incoming-bin-hm-size val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3162 (set (if (efs-use-gateway-p efs-process-host t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3163 'efs-gateway-hash-mark-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3164 'efs-hash-mark-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3165 val)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3166
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3167 (defun efs-process-handle-hash (str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3168 ;; Remove hash marks from STRING and display count so far.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3169 (if (string-match "^#+$" str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3170 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3171 (setq efs-process-hash-mark-count
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3172 (+ efs-process-hash-mark-count
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3173 (- (match-end 0) (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3174 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3175 efs-process-msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3176 efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3177 (not (and efs-process-nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3178 (or (eq efs-verbose 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3179 (eq (selected-window) (minibuffer-window)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3180 (efs-message-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3181 (let* ((big (> efs-process-hash-mark-count 65536)) ; 2^16
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3182 (kbytes (if big
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3183 (* efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3184 (ash efs-process-hash-mark-count -6))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3185 (ash (* efs-process-hash-mark-unit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3186 efs-process-hash-mark-count)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3187 -6))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3188 (if (zerop efs-process-xfer-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3189 (or (zerop kbytes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3190 (efs-message "%s...%dk" efs-process-msg kbytes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3191 (let ((percent (if big
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3192 (/ (* 100 (ash kbytes -7))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3193 (ash efs-process-xfer-size -7))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3194 (/ (* 100 kbytes) efs-process-xfer-size))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3195 ;; Don't display %'s betwwen 100 and 110
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3196 (and (> percent 100) (< percent 110) (setq percent 100))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3197 ;; cut out the redisplay of identical %-age messages.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3198 (or (eq percent efs-process-last-percent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3199 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3200 (setq efs-process-last-percent percent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3201 (efs-message "%s...%d%%" efs-process-msg percent)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3202 (concat (substring str 0 (match-beginning 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3203 (and (/= (length str) (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3204 (substring str (1+ (match-end 0))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3205 str))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3206
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3207 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3208 ;;;; Keeping track of the number of active background connections.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3209 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3210
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3211 (defun efs-ftp-processes-active ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3212 ;; Return the number of FTP processes busy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3213 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3214 (length
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3215 (delq nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3216 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3217 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3218 (lambda (buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3219 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3220 (and (boundp 'efs-process-busy)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3221 efs-process-busy)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3222 (buffer-list))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3223
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3224 (defun efs-update-mode-line ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3225 ;; Updates the mode with FTP activity, and runs `efs-ftp-activity-function'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3226 (let ((num (efs-ftp-processes-active)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3227 (if efs-mode-line-format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3228 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3229 (if (zerop num)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3230 (setq efs-mode-line-string "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3231 (setq efs-mode-line-string (format efs-mode-line-format num)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3232 ;; fake emacs into re-calculating all the mode lines.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3233 (save-excursion (set-buffer (other-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3234 (set-buffer-modified-p (buffer-modified-p))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3235 (if efs-ftp-activity-function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3236 (funcall efs-ftp-activity-function num))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3237
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3238 (defun efs-display-ftp-activity ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3239 "Displays the number of active background ftp sessions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3240 Uses the variable `efs-mode-line-format' to determine how this will be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3241 displayed."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3242 (interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3243 (or (memq 'efs-mode-line-string global-mode-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3244 (if global-mode-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3245 (nconc global-mode-string '(efs-mode-line-string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3246 (setq global-mode-string '("" efs-mode-line-string)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3247
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3248 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3249 ;;;; Expiring inactive ftp buffers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3250 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3251
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3252 (defun efs-start-polling ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3253 ;; Start polling FTP buffers, to look for idle ones.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3254 (or (null efs-expire-ftp-buffers)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3255 (let ((proc (get-process "efs poll")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3256 (or (and proc (eq (process-status proc) 'run))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3257 (let ((default-directory exec-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3258 (process-connection-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3259 new-proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3260 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3261 (delete-process "efs poll")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3262 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3263 (setq new-proc (start-process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3264 "efs poll" nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3265 (concat exec-directory "wakeup")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3266 (int-to-string efs-ftp-buffer-poll-time)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3267 (set-process-filter new-proc (function efs-expire-ftp-buffers-filter))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3268 (process-kill-without-query new-proc))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3269
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3270 (defun efs-connection-visited-p (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3271 ;; Returns t if there are any buffers visiting files on HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3272 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3273 (let ((list (buffer-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3274 (case-fold (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3275 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3276 (visited nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3277 parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3278 (setq host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3279 (if case-fold (setq user (downcase user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3280 (while list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3281 (set-buffer (car list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3282 (if (or (and buffer-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3283 (setq parsed (efs-ftp-path buffer-file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3284 (string-equal host (downcase (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3285 (string-equal user (if case-fold
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3286 (downcase (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3287 (nth 1 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3288 (and (boundp 'dired-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3289 (stringp dired-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3290 efs-dired-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3291 (setq parsed (efs-ftp-path dired-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3292 (string-equal host (downcase (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3293 (string-equal user (if case-fold
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3294 (downcase (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3295 (nth 1 parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3296 (setq visited t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3297 list nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3298 (setq list (cdr list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3299 visited)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3300
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3301 (defun efs-expire-ftp-buffers-filter (proc string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3302 ;; Check all ftp buffers, and kill them if they have been inactive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3303 ;; for the minimum of efs-ftp-buffer-expire-time and their local
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3304 ;; time out time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3305 (if efs-expire-ftp-buffers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3306 (let ((list (buffer-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3307 new-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3308 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3309 (while list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3310 (set-buffer (car list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3311 (if (eq major-mode 'efs-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3312 (let* ((proc (get-buffer-process (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3313 (proc-p (and proc (memq (process-status proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3314 '(run open)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3315 (if (or efs-ftp-buffer-expire-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3316 efs-process-idle-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3317 (null proc-p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3318 (let ((elt (assq (car list) efs-ftp-buffer-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3319 (wind-p (get-buffer-window (car list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3320 (if (or (null elt) (buffer-modified-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3321 efs-process-busy wind-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3322 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3323 (setq new-alist (cons (cons (car list) 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3324 new-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3325 (or wind-p (set-buffer-modified-p nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3326 (let ((idle (+ (cdr elt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3327 efs-ftp-buffer-poll-time)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3328 (if (and proc-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3329 (< idle
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3330 (if efs-ftp-buffer-expire-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3331 (if efs-process-idle-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3332 (min efs-ftp-buffer-expire-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3333 efs-process-idle-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3334 efs-ftp-buffer-expire-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3335 efs-process-idle-time)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3336 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3337 (setq new-alist (cons (cons (car list) idle)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3338 new-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3339 (set-buffer-modified-p nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3340 ;; If there are still buffers for host & user,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3341 ;; don't wipe the cache.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3342 (and proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3343 (efs-connection-visited-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3344 efs-process-host efs-process-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3345 (set-process-sentinel proc nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3346 (kill-buffer (car list)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3347 (setq list (cdr list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3348 (setq efs-ftp-buffer-alist new-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3349 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3350 (delete-process "efs poll")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3351 (error nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3352
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3353 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3354 ;;;; When the FTP client process dies...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3355 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3356
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3357 (defun efs-process-sentinel (proc str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3358 ;; When ftp process changes state, nuke all file-entries in cache.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3359 (let ((buff (process-buffer proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3360 ;; If the client dies, make sure that efs doesn't think that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3361 ;; there is a running process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3362 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3363 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3364 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3365 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3366 (setq efs-process-busy nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3367 (error nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3368 (let ((parsed (efs-parse-proc-name proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3369 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3370 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3371 (apply 'efs-wipe-file-entries parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3372 (apply 'efs-wipe-from-ls-cache parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3373 (if (or efs-mode-line-format efs-ftp-activity-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3374 (efs-update-mode-line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3375
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3376 (defun efs-kill-ftp-process (buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3377 "Kill an FTP connection and its associated process buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3378 If the BUFFER's visited file name or default-directory is an efs remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3379 file name, it is the connection for that file name that is killed."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3380 (interactive "bKill FTP process associated with buffer: ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3381 (or buffer (setq buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3382 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3383 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3384 (if (eq major-mode 'efs-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3385 (kill-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3386 (let ((file (or (buffer-file-name) default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3387 (if file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3388 (let ((parsed (efs-ftp-path (expand-file-name file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3389 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3390 (let ((host (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3391 (user (nth 1 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3392 (kill-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3393 (efs-ftp-process-buffer host user))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3394
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3395 (defun efs-close-ftp-process (buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3396 "Close an FTP connection.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3397 This kills the FTP client process, but unlike `efs-kill-ftp-process' this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3398 neither kills the process buffer, nor deletes cached data for the connection."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3399 (interactive "bClose FTP process associated with buffer: ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3400 (or buffer (setq buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3401 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3402 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3403 (if (eq major-mode 'efs-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3404 (let ((process (get-buffer-process buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3405 (if process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3406 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3407 (set-process-sentinel process nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3408 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3409 efs-process-q nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3410 (if (or efs-mode-line-format efs-ftp-activity-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3411 (efs-update-mode-line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3412 (delete-process process))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3413 (let ((file (or (buffer-file-name) default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3414 (if file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3415 (let ((parsed (efs-ftp-path (expand-file-name file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3416 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3417 (let ((process (get-process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3418 (format "*ftp %s@%s*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3419 (nth 1 parsed) (car parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3420 (if process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3421 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3422 (set-buffer (process-buffer process))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3423 (set-process-sentinel process nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3424 (setq efs-process-busy nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3425 efs-process-q nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3426 (if (or efs-mode-line-format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3427 efs-ftp-activity-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3428 (efs-update-mode-line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3429 (delete-process process)))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3430
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3431 (defun efs-ping-ftp-connection (buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3432 "Ping a connection by sending a NOOP command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3433 Useful for waking up a possible expired connection."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3434 (interactive "bPing FTP connection associated with buffer: ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3435 (or buffer (setq buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3436 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3437 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3438 (let (file host user parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3439 (if (or (and (eq major-mode 'efs-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3440 (setq host efs-process-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3441 user efs-process-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3442 (and (setq file (or (buffer-file-name) default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3443 (setq parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3444 (setq host (car parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3445 user (nth 1 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3446 (or (car
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3447 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3448 host user '(quote noop)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3449 (format "Pinging connection %s@%s" user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3450 (message "Connection %s@%s is alive." user host))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3451
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3452 (defun efs-display-ftp-process-buffer (buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3453 "Displays the FTP process buffer associated with the current buffer."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3454 (interactive "bDisplay FTP buffer associated with buffer: ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3455 (if (null buffer) (setq buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3456 (let ((file (or (buffer-file-name) default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3457 parsed proc-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3458 (if (and file (setq parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3459 (setq proc-buffer (get-buffer (efs-ftp-process-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3460 (car parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3461 (nth 1 parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3462 (display-buffer proc-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3463 (error "Buffer %s not associated with an FTP process" buffer))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3464
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3465 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3466 ;;;; Starting the FTP client process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3467 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3468
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3469 (defun efs-ftp-process-buffer (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3470 "Return name of the process buffer for ftp process for HOST and USER."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3471 ;; Host names on the internet are case-insensitive.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3472 (format efs-ftp-buffer-format user (downcase host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3473
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3474 (defun efs-pty-check (proc threshold)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3475 ;; Checks to see if PROC is a pty. Beware, it clobbers the process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3476 ;; filter, so run this before you set the filter.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3477 ;; THRESHOLD is an integer to tell it how long to wait for output.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3478 (sit-for 0) ; Update the display before doing any waiting.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3479 (let ((efs-pipe-p t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3480 (n 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3481 (set-process-filter proc (function (lambda (proc string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3482 (setq efs-pipe-p nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3483 (while (and (< n threshold) efs-pipe-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3484 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3485 (setq n (1+ n)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3486 (if efs-pipe-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3487 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3488 (sit-for 0) ; update display
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3489 ;; Use a sleep-for as I don't want pty-checking to depend
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3490 ;; on pending input.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3491 (sleep-for efs-pty-check-retry-time)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3492 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3493 (if efs-pipe-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3494 (if (or noninteractive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3495 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3496 ;; in case the user typed something during the wait.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3497 (discard-input)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3498 (y-or-n-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3499 (format "%s seems not a pty. Kill? " proc))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3500 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3501 (kill-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3502 (if (eq (selected-window) (minibuffer-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3503 (abort-recursive-edit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3504 (signal 'quit nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3505 ;; Need to send a \n to make sure, because sometimes we get the startup
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3506 ;; prompt from a pipe.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3507 (sit-for 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3508 (process-send-string proc "\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3509 (setq efs-pipe-p t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3510 n 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3511 (while (and (< n threshold) efs-pipe-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3512 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3513 (setq n (1+ n)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3514 (if efs-pipe-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3515 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3516 (sit-for 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3517 (sleep-for efs-pty-check-retry-time)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3518 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3519 (if (and efs-pipe-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3520 (or noninteractive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3521 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3522 ;; in case the user typed something during the wait.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3523 (discard-input)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3524 (y-or-n-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3525 (format "%s seems not a pty. Kill? " proc)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3526 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3527 (kill-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3528 (if (eq (selected-window) (minibuffer-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3529 (abort-recursive-edit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3530 (signal 'quit nil)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3531
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3532 (defun efs-start-process (host user name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3533 "Spawn a new ftp process ready to connect to machine HOST as USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3534 If HOST is only ftp-able through a gateway machine then spawn a shell
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3535 on the gateway machine to do the ftp instead. NAME is the name of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3536 process."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3537 (let* ((use-gateway (efs-use-gateway-p host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3538 (buffer (get-buffer-create (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3539 (process-connection-type t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3540 (opaque-p (memq use-gateway efs-opaque-gateways))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3541 proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3542 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3543 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3544 (efs-mode host user (if opaque-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3545 efs-gateway-ftp-prompt-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3546 efs-ftp-prompt-regexp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3547 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3548 ((null use-gateway)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3549 (message "Opening FTP connection to %s..." host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3550 (setq proc (apply 'start-process name buffer efs-ftp-program-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3551 efs-ftp-program-args)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3552 ((eq use-gateway 'interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3553 (setq proc (efs-gwp-start host user name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3554 ((eq use-gateway 'remsh)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3555 (message "Opening FTP connection to %s via %s..." host efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3556 (setq proc (apply 'start-process name buffer (nth 1 efs-gateway-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3557 (append (list efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3558 (nth 2 efs-gateway-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3559 (list (nth 3 efs-gateway-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3560 (nth 4 efs-gateway-type)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3561 ((memq use-gateway '(proxy raptor interlock kerberos))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3562 (message "Opening FTP connection to %s via %s..." host efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3563 (setq proc (apply 'start-process name buffer (nth 1 efs-gateway-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3564 (nth 2 efs-gateway-type))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3565 ((eq use-gateway 'local)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3566 (message "Opening FTP connection to %s..." host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3567 (setq proc (apply 'start-process name buffer (nth 1 efs-gateway-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3568 (nth 2 efs-gateway-type))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3569 ((error "Never heard of gateway type %s" use-gateway)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3570 (process-kill-without-query proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3571 (if opaque-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3572 (accept-process-output proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3573 (if efs-pty-check-threshold
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3574 (efs-pty-check proc efs-pty-check-threshold)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3575 (accept-process-output proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3576 (set-process-sentinel proc (function efs-process-sentinel))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3577 (set-process-filter proc (function efs-process-filter))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3578 (efs-start-polling)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3579 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3580 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3581 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3582 (set-marker (process-mark proc) (point)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3583 proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3584
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3585 (defun efs-get-process-internal (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3586 ;; Get's the first process for HOST and USER. If HOST runs a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3587 ;; a case insignificant OS, then case is not considered in USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3588 (let ((list (process-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3589 (case-fold (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3590 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3591 (len (+ (length host) (length user) 7))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3592 fmt name found)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3593 (setq host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3594 (if case-fold (setq user (downcase user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3595 (while (and (not found) list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3596 (setq name (process-name (car list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3597 (if (and (= (length name) len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3598 (string-equal (substring name 0 5) "*ftp ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3599 (string-equal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3600 (if case-fold (downcase (substring name 5)) (substring name 5))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3601 (or fmt (setq fmt (format "%s@%s*" user host))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3602 (memq (process-status (car list)) '(run open)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3603 (setq found (car list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3604 (setq list (cdr list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3605 found))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3606
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3607 ;; efs-guess-host-type calls this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3608 ;; function recursively. The (if (and proc... avoids an infinite
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3609 ;; loop. We should make sure that this won't hang things if the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3610 ;; connection goes wrong.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3611
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3612 (defun efs-get-process (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3613 "Return the process object for the FTP process for HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3614 Create a new process if needed."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3615
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3616 (let ((proc (efs-get-process-internal host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3617 (if (and proc (memq (process-status proc) '(run open)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3618 proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3619
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3620 ;; Make sure that the process isn't around in some strange state.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3621
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3622 (setq host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3623 (let ((name (concat "*ftp " user "@" host "*")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3624 (if proc (condition-case nil (delete-process proc) (error nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3625
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3626 ;; grab a suitable process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3627 (setq proc (efs-start-process host user name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3628
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3629 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3630 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3631 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3632
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3633 ;; Run any user-specified hooks.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3634 (run-hooks 'efs-ftp-startup-hook)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3635
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3636 ;; login to FTP server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3637 (efs-login host user proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3638
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3639 ;; Beware, the process may have died if the login went bad.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3640 (if (memq (process-status proc) '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3641
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3642 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3643 ;; Tell client to send back hash-marks as progress. It isn't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3644 ;; usually fatal if this command fails.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3645 (efs-guess-hash-mark-size proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3646
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3647 ;; Run any user startup functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3648 (let ((alist efs-ftp-startup-function-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3649 (case-fold-search t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3650 (while alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3651 (if (string-match (car (car alist)) host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3652 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3653 (funcall (cdr (car alist)) host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3654 (setq alist nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3655 (setq alist (cdr alist)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3656
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3657 ;; Guess at the host type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3658 (efs-guess-host-type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3659
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3660 ;; Check the idle time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3661 (efs-check-idle host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3662
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3663 proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3664
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3665 ;; Hopefully a recursive retry worked.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3666 (or (efs-get-process-internal host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3667 (error "No FTP process for %s@%s" user host)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3668
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3669 (defun efs-guess-hash-mark-size (proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3670 ;; Doesn't run efs-save-match-data. You must do that yourself.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3671 (if efs-send-hash
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3672 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3673 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3674 (let ((line (nth 1 (efs-raw-send-cmd proc "hash")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3675 (gate-p (efs-use-gateway-p efs-process-host t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3676 ;; Don't guess if the hash-mark-size is already set.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3677 (or (if gate-p efs-gateway-hash-mark-size efs-hash-mark-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3678 (if (string-match efs-hash-mark-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3679 (let ((size (substring line (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3680 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3681 (if (string-match "^[0-9]+$" size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3682 (set (if gate-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3683 'efs-gateway-hash-mark-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3684 'efs-hash-mark-size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3685 (string-to-int size))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3686
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3687 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3688 ;;;; Simple FTP process shell support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3689 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3690
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3691 (defun efs-mode (host user prompt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3692 "Major mode for interacting with an FTP process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3693 The user interface for sending commands to the FTP process is `comint-mode'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3694 For more information see the documentation for `comint-mode'. This command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3695 is not intended for interactive use.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3696 Takes arguments: HOST USER PROMPT
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3697
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3698 Runs efs-mode-hook if it is not nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3699
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3700 Key map:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3701 \\{comint-mode-map}"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3702 (let ((proc (get-buffer-process (current-buffer))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3703 ;; Running comint-mode will kill-all-local-variables.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3704 (comint-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3705 ;; All these variables are buffer local.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3706 (setq major-mode 'efs-mode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3707 mode-name "efs"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3708 default-directory (file-name-directory efs-tmp-name-template)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3709 comint-prompt-regexp prompt
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3710 efs-process-host host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3711 efs-process-user user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3712 efs-process-prompt-regexp prompt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3713 (set (make-local-variable 'paragraph-start) comint-prompt-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3714 ;; Old versions of comint don't have this. It does no harm for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3715 ;; the newer ones.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3716 (set (make-local-variable 'comint-last-input-start) (make-marker))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3717 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3718 ;; in case there is a running process
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3719 (if proc (set-marker (process-mark proc) (point)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3720 (run-hooks 'efs-mode-hook)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3721
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3722
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3723 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3724 ;;;; >6
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3725 ;;;; Sending commands to the FTP server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3726 ;;;; =============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3727
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3728 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3729 ;;;; General purpose functions for sending commands.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3730 ;;;; -------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3731
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3732 (defun efs-raw-send-cmd (proc cmd &optional msg pre-cont cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3733 ;; Low-level routine to send the given ftp CMD to the ftp PROCESS.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3734 ;; MSG is an optional message to output before and after the command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3735 ;; If PRE-CONT is non-nil, it is called immediately after execution
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3736 ;; of the command starts, but without waiting for it to finish.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3737 ;; If CONT is non-NIL then it is either a function or a list of function and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3738 ;; some arguments. The function will be called when the ftp command has
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3739 ;; completed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3740 ;; If CONT is NIL then this routine will return \( RESULT . LINE \) where
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3741 ;; RESULT is whether the command was successful, and LINE is the line from
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3742 ;; the FTP process that caused the command to complete.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3743 ;; If NOWAIT is nil then we will wait for the command to complete before
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3744 ;; returning. If NOWAIT is 0, then we will wait until the command starts,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3745 ;; executing before returning. NOWAIT of 1 is like 0, except that the modeline
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3746 ;; will indicate an asynch FTP command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3747 ;; If NOWAIT has any other value, then we will simply queue the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3748 ;; command. In all cases, CONT will still be called
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3749
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3750 (if (memq (process-status proc) '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3751 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3752 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3753
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3754 (if efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3755 ;; This function will always wait on a busy process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3756 ;; Queueing is done by efs-send-cmd.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3757 (let ((efs-process-cmd-waiting t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3758 (efs-kbd-quit-protect proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3759 (while efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3760 (accept-process-output)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3761
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3762 (setq efs-process-string ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3763 efs-process-result-line ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3764 efs-process-result-cont-lines ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3765 efs-process-busy t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3766 efs-process-msg (and efs-verbose msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3767 efs-process-continue cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3768 efs-process-server-confused nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3769 efs-process-nowait nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3770 efs-process-hash-mark-count 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3771 efs-process-last-percent -1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3772 efs-process-xfer-size 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3773 efs-process-cmd-counter (% (1+ efs-process-cmd-counter) 16))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3774 (process-kill-without-query proc t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3775 (and efs-process-msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3776 (efs-message-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3777 (efs-message "%s..." efs-process-msg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3778 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3779 (move-marker comint-last-input-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3780 (move-marker comint-last-input-end (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3781 ;; don't insert the password into the buffer on the USER command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3782 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3783 (if (string-match efs-passwd-cmds cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3784 (insert (setq efs-process-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3785 (substring cmd 0 (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3786 " Turtle Power!\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3787 (setq efs-process-cmd cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3788 (insert cmd "\n")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3789 (process-send-string proc (concat cmd "\n"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3790 (set-marker (process-mark proc) (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3791 ;; Update the mode-line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3792 (if (and (or efs-mode-line-format efs-ftp-activity-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3793 (memq nowait '(t 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3794 (efs-update-mode-line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3795 (if pre-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3796 (let ((efs-nested-cmd t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3797 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3798 (apply (car pre-cont) (cdr pre-cont)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3799 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3800 (if nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3801 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3802 ;; hang around for command to complete
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3803 ;; Some clients die after the command is sent, if the server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3804 ;; times out. Don't wait on dead processes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3805 (efs-kbd-quit-protect proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3806 (while (and efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3807 ;; Need to recheck nowait, since it may get reset
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3808 ;; in a cont.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3809 (null efs-process-nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3810 (memq (process-status proc) '(run open)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3811 (accept-process-output proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3812
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3813 ;; cont is called by the process filter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3814 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3815 ;; Return nil if a cont was called.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3816 ;; Can't return process-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3817 ;; and process-line since executing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3818 ;; the cont may have changed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3819 ;; the state of the process buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3820 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3821 (list efs-process-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3822 efs-process-result-line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3823 efs-process-result-cont-lines)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3824
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3825 ;; If the process died, the filter would have never got the chance
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3826 ;; to call the cont. Try to jump start things.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3827
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3828 (if (and (not (memq (process-status proc) '(run open)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3829 (string-equal efs-process-result-line "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3830 cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3831 (equal cont efs-process-continue))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3832 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3833 (setq efs-process-continue nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3834 efs-process-busy nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3835 ;; The process may be in some strange state. Get rid of it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3836 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3837 (efs-call-cont cont 'fatal "" "")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3838
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3839 (error "FTP process %s has died." (process-name proc))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3840
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3841 (efs-defun efs-quote-string nil (string &optional not-space)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3842 "Quote any characters in STRING that may confuse the ftp process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3843 If NOT-SPACE is non-nil, then blank characters are not quoted, because
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3844 it is assumed that the string will be surrounded by \"'s."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3845 (apply (function concat)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3846 (mapcar (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3847 (lambda (char)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3848 (if (or (< char ?\ )
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3849 (and (null not-space) (= char ?\ ))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3850 (> char ?\~)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3851 (= char ?\")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3852 (= char ?\\))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3853 (vector ?\\ char)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3854 (vector char))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3855 string)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3856
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3857 (efs-defun efs-fix-path nil (path &optional reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3858 "Convert PATH from a unix format to a non-unix format.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3859 If optional REVERSE, convert in the opposite direction."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3860 (identity path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3861
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3862 (efs-defun efs-fix-dir-path nil (dir-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3863 "Convert DIR-PATH from unix format to a non-unix format for a dir listing"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3864 ;; The default def runs for dos-distinct, ka9q, and all the unix's.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3865 ;; To be more careful about distinguishing dirs from plain files,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3866 ;; we append a ".".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3867 (let ((len (length dir-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3868 (if (and (not (zerop len)) (= (aref dir-path (1- len)) ?/))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3869 (concat dir-path ".")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3870 dir-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3871
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3872 (defun efs-send-cmd (host user cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3873 &optional msg pre-cont cont nowait noretry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3874 "Find an ftp process connected to HOST logged in as USER and send it CMD.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3875 MSG is an optional status message to be output before and after issuing the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3876 command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3877
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3878 See the documentation for efs-raw-send-cmd for a description of CONT, PRE-CONT
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3879 and NOWAIT. Normally, if the command fails it is retried. If NORETRY is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3880 non-nil, this is not done."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3881 ;; Handles conversion to remote pathname syntax and remote ls option
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3882 ;; capability. Also, sends umask if nec.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3883
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3884 (let ((proc (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3885
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3886 (if (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3887 (eq nowait t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3888 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3889 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3890 (or efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3891 efs-process-cmd-waiting)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3892
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3893 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3894 (efs-add-to-queue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3895 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3896 ;; Not nec. to store host and user, because the queue is for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3897 ;; a specific host user pair anyway. Because the queue is always
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3898 ;; examined when efs-process-busy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3899 ;; is nil, it should be impossible to get into a loop
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3900 ;; where we keep re-queueing over and over. To be on the safe
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3901 ;; side, store nowait as 1.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3902 (list cmd msg pre-cont cont 1 noretry))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3903 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3904
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3905 ;; Send a command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3906
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3907 (let (cmd-string afsc-result afsc-line afsc-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3908
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3909 (let ((efs-nested-cmd t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3910 (cmd0 (car cmd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3911 (cmd1 (nth 1 cmd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3912 (cmd2 (nth 2 cmd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3913 (cmd3 (nth 3 cmd)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3914
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3915 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3916
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3917 ((eq cmd0 'quote)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3918 ;; QUOTEd commands
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3919 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3920
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3921 ((eq cmd1 'site)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3922 ;; SITE commands
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3923 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3924 ((memq cmd2 '(umask idle dos exec nfs group gpass))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3925 ;; For UMASK cmd3 = value of umask
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3926 ;; For IDLE cmd3 = idle setting, or nil if we're querying.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3927 ;; For DOS and NFS cmd3 is nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3928 ;; For EXEC cmd3 is the command to be exec'ed -- a string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3929 (if cmd3 (setq cmd3 (concat " " cmd3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3930 (setq cmd-string (concat "quote site " (symbol-name cmd2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3931 cmd3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3932 ((eq cmd2 'chmod)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3933 (let* ((host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3934 (cmd4 (efs-quote-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3935 host-type (efs-fix-path host-type (nth 4 cmd)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3936 (setq cmd-string (concat "quote site chmod " cmd3 " "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3937 cmd4))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3938 (t (error "efs: Don't know how to send %s %s %s %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3939 cmd0 cmd1 cmd2 cmd3))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3940
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3941 ((memq cmd1 '(pwd xpwd syst pasv noop))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3942 (setq cmd-string (concat "quote " (symbol-name cmd1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3943
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3944 ;; PORT command (cmd2 is IP + port address)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3945 ((eq cmd1 'port)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3946 (setq cmd-string (concat "quote port " cmd2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3947
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3948 ((memq cmd1 '(appe retr))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3949 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3950 ;; Set an xfer type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3951 (if cmd3 (efs-set-xfer-type host user cmd3 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3952 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3953 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3954 cmd-string (concat "quote " (symbol-name cmd1) " "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3955 cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3956
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3957 ((eq cmd1 'stor)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3958 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3959 (if (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3960 (efs-set-umask host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3961 ;; Set an xfer type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3962 (if cmd3 (efs-set-xfer-type host user cmd3 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3963 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3964 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3965 cmd-string (concat "quote stor " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3966
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3967 ((memq cmd1 '(size mdtm rnfr))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3968 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3969 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3970 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3971 cmd-string (concat "quote "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3972 (symbol-name cmd1) " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3973
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3974 ((memq cmd1 '(pass user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3975 (setq cmd-string (concat "quote " (symbol-name cmd1) " " cmd2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3976
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3977 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3978 (error "efs: Don't know how to send %s %s %s %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3979 cmd0 cmd1 cmd2 cmd3))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3980
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3981 ;; TYPE command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3982 ((eq cmd0 'type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3983 (setq cmd-string (concat "type " (symbol-name cmd1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3984
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3985 ;; DIR command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3986 ;; cmd == 'dir "remote-path" "local-path" "ls-switches"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3987 ((memq cmd0 '(dir nlist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3988 (let ((host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3989 (listing-type (efs-listing-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3990 (setq cmd1 (efs-fix-dir-path host-type cmd1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3991 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3992 ((memq listing-type efs-nlist-listing-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3993 (setq cmd-string (concat efs-nlist-cmd " "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3994 (efs-quote-string host-type cmd1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3995 " " cmd2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3996 ((or (memq host-type efs-dumb-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3997 (null cmd3))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3998 (setq cmd-string (format "%s %s %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
3999 (if (eq cmd0 'nlist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4000 efs-nlist-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4001 "dir")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4002 (efs-quote-string host-type cmd1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4003 cmd2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4004 ((setq cmd-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4005 (format "%s \"%s %s\" %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4006 (if (eq cmd0 'nlist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4007 efs-nlist-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4008 "ls")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4009 cmd3 (efs-quote-string host-type cmd1 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4010 ;; cmd2 is a temp file, not nec. to quote.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4011 cmd2))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4012
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4013 ;; First argument is the remote pathname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4014 ((memq cmd0 '(delete mkdir rmdir cd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4015 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4016 (setq cmd1 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4017 (efs-fix-path host-type cmd1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4018 cmd-string (concat (symbol-name cmd0) " " cmd1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4019
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4020 ;; GET command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4021 ((eq cmd0 'get)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4022 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4023 (if cmd3 (efs-set-xfer-type host user cmd3))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4024 (efs-set-hash-mark-unit host user t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4025 (setq cmd1 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4026 (efs-fix-path host-type cmd1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4027 cmd2 (efs-quote-string host-type cmd2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4028 cmd-string (concat "get " cmd1 " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4029
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4030 ;; PUT command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4031 ((eq cmd0 'put)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4032 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4033 (if (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4034 (efs-set-umask host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4035 (if cmd3 (efs-set-xfer-type host user cmd3))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4036 (efs-set-hash-mark-unit host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4037 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4038 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4039 cmd1 (efs-quote-string host-type cmd1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4040 cmd-string (concat "put " cmd1 " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4041
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4042 ;; APPEND command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4043 ((eq cmd0 'append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4044 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4045 (if cmd3 (efs-set-xfer-type host user cmd3))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4046 (efs-set-hash-mark-unit host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4047 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4048 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4049 cmd1 (efs-quote-string host-type cmd1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4050 cmd-string (concat "append " cmd1 " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4051
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4052 ;; CHMOD command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4053 ((eq cmd0 'chmod)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4054 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4055 (setq cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4056 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4057 cmd-string (concat "chmod " cmd1 " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4058
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4059 ;; Both arguments are remote pathnames
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4060 ((eq cmd0 'rename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4061 (let ((host-type (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4062 (setq cmd1 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4063 (efs-fix-path host-type cmd1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4064 cmd2 (efs-quote-string host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4065 (efs-fix-path host-type cmd2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4066 cmd-string (concat "rename " cmd1 " " cmd2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4067
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4068 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4069 (error "efs: Don't know how to send %s %s %s %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4070 cmd0 cmd1 cmd2 cmd3))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4071
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4072 ;; Actually send the resulting command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4073 ;; Why do we use this complicated binding of afsc-{result,line},
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4074 ;; rather then use the fact that efs-raw-send-cmd returns?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4075 ;; Because efs-raw-send-cmd returns the result of the first
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4076 ;; attempt only. efs-send-cmd should return the result of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4077 ;; the retry, if one was necessary.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4078 ;; Maybe it would be better if efs-raw-send-cmd returned
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4079 ;; the result of cont, if nowait was nil? Or maybe still return
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4080 ;; \(result line \)? As long as nowait is nil, it should
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4081 ;; return something useful.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4082
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4083 ;; Beware, if some of the above FTP commands had to restart
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4084 ;; the process, PROC won't be set to the right process object.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4085 (setq proc (efs-get-process host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4086
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4087 (efs-raw-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4088 proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4089 cmd-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4090 msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4091 pre-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4092 (efs-cont (result line cont-lines) (host user proc cmd msg pre-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4093 cont nowait noretry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4094 (cond ((and (null noretry) (eq result 'fatal))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4095 (let ((retry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4096 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4097 host user cmd msg pre-cont cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4098 (if (eq nowait t) 1 nowait) t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4099 (or cont nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4100 (setq afsc-result (car retry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4101 afsc-line (nth 1 retry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4102 afsc-cont-lines (nth 2 retry)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4103 ((and (eq result 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4104 (or (memq (car cmd) '(append rename put))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4105 (and (eq (car cmd) 'quote)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4106 (eq (nth 1 cmd) 'stor)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4107 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4108 (string-match efs-write-protect-msgs line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4109 (let ((retry (efs-write-recover
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4110 (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4111 line cont-lines host user cmd msg pre-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4112 cont nowait noretry)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4113 (or cont nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4114 (setq afsc-result (car retry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4115 afsc-line (nth 1 retry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4116 afsc-cont-lines (nth 2 retry)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4117
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4118 (t (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4119 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4120 (or nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4121 (setq afsc-result result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4122 afsc-line line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4123 afsc-cont-lines cont-lines))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4124 nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4125
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4126 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4127 (if (or nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4128 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4129 (list afsc-result afsc-line afsc-cont-lines))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4130
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4131 ;; Check the queue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4132 (or nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4133 efs-nested-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4134 (let ((buff (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4135 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4136 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4137 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4138 (if efs-process-q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4139 (let ((next (car efs-process-q)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4140 (setq efs-process-q (cdr efs-process-q))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4141 (apply 'efs-send-cmd host user next))))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4142
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4143 (efs-defun efs-write-recover nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4144 (line cont-lines host user cmd msg pre-cont cont nowait noretry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4145 "Called when a write command fails with `efs-write-protect-msgs'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4146 Should return \(result line cont-lines\), like `efs-raw-send-cmd'."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4147 ;; This default version doesn't do anything.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4148 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4149 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4150 (efs-call-cont cont 'failed line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4151 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4152 (if nowait nil (list 'failed line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4153
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4154 ;;;; ---------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4155 ;;;; The login sequence. (The follows RFC959 rather tightly. If a server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4156 ;;;; can't even get the login codes right, it is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4157 ;;;; pretty much scrap metal.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4158 ;;;; ---------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4159
40
7e54bd776075 Import from CVS: tag r19-15b103
cvs
parents: 24
diff changeset
4160 ;;;###autoload
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4161 (defun efs-nslookup-host (host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4162 "Attempt to resolve the given HOSTNAME using nslookup if possible."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4163 (interactive "sHost: ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4164 (if efs-nslookup-program
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4165 (let* ((default-directory exec-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4166 (default-major-mode 'fundamental-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4167 (process-connection-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4168 (proc (start-process " *nslookup*" " *nslookup*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4169 efs-nslookup-program host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4170 (res host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4171 (process-kill-without-query proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4172 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4173 (set-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4174 (let ((quit-flag nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4175 (inhibit-quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4176 (while (memq (process-status proc) '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4177 (accept-process-output proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4178 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4179 (if (re-search-forward
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4180 "Name:.*\nAddress\\(es\\)?: *\\([.0-9]+\\)$" nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4181 (setq res (buffer-substring (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4182 (match-end 2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4183 (kill-buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4184 (if (interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4185 (message "%s: %s" host res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4186 res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4187 (if (interactive-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4188 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4189 "No nslookup program. See the variable efs-nslookup-program."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4190 host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4191
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4192 (defun efs-login (host user proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4193 "Connect to the FTP-server on HOST as USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4194 PROC is the process to the FTP-client. Doesn't call efs-save-match-data.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4195 You must do that yourself."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4196 (let ((gate (efs-use-gateway-p host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4197 (if (eq gate 'kerberos)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4198 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4199 (setq proc (efs-kerberos-login host user proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4200 (efs-login-send-user host user proc gate))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4201 (let ((to (if (memq gate '(proxy local raptor))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4202 efs-gateway-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4203 host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4204 port cmd result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4205 (if (string-match "#" to)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4206 (setq port (substring to (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4207 to (substring to 0 (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4208 (and efs-nslookup-on-connect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4209 (string-match "[^0-9.]" to)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4210 (setq to (efs-nslookup-host to)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4211 (setq cmd (concat "open " to))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4212 (if port (setq cmd (concat cmd " " port)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4213
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4214 ;; Send OPEN command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4215 (setq result (efs-raw-send-cmd proc cmd nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4216
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4217 (and (eq gate 'interlock) (string-match "^331 " (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4218 (setq result (efs-login-send-pass
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4219 efs-gateway-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4220 (efs-get-user efs-gateway-host) proc)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4221
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4222 ;; Analyze result of OPEN.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4223 (if (car result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4224 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4225 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4226 (efs-error host user (concat "OPEN request failed: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4227 (nth 1 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4228 (efs-login-send-user host user proc gate))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4229
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4230 (defun efs-login-send-user (host user proc &optional gate retry)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4231 "Send user command to HOST and USER. PROC is the ftp client process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4232 Optional argument GATE specifies which type of gateway is being used.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4233 RETRY argument specifies to try twice if we get a 421 response."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4234 (let ((cmd (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4235 ((memq gate '(local proxy interlock))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4236 (format "quote USER \"%s\"@%s" user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4237 (if (and efs-nslookup-on-connect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4238 (string-match "[^0-9.]" host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4239 (efs-nslookup-host host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4240 host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4241 ((eq gate 'raptor)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4242 (format "quote USER \"%s\"@%s %s" user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4243 (if (and efs-nslookup-on-connect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4244 (string-match "[^0-9.]" host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4245 (efs-nslookup-host host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4246 host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4247 (nth 3 efs-gateway-type)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4248 ((eq gate 'kerberos)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4249 (let ((to host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4250 port)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4251 (if (string-match "#" host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4252 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4253 (setq to (substring host 0 (match-beginning 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4254 port (substring host (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4255 (and efs-nslookup-on-connect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4256 (string-match "[^0-9.]" to)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4257 (efs-nslookup-host to))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4258 (setq to (concat to "@" port))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4259 (format "quote user \"%s\"@%s" user to)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4260 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4261 (format "quote user \"%s\"" user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4262 (msg (format "Logging in as user %s%s..." user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4263 (if (memq gate '(proxy local raptor kerberos))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4264 (concat "@" host) "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4265 result code)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4266
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4267 ;; Send the message by hand so that we can report on the size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4268 ;; of the MOTD.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4269 (message msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4270
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4271 ;; Send USER command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4272 (setq result (efs-raw-send-cmd proc cmd nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4273
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4274 ;; Analyze result of USER (this follows RFC959 strictly)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4275 (if (< (length (nth 1 result)) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4276 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4277 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4278 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4279 (concat "USER request failed: " (nth 1 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4280
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4281 (setq code (substring (nth 1 result) 0 4))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4282 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4283
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4284 ((string-equal "331 " code)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4285 ;; Need password
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4286 (setq result (efs-login-send-pass host user proc gate)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4287
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4288 ((string-equal "332 " code)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4289 ;; Need an account, but no password
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4290 (setq result (efs-login-send-acct host user proc gate)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4291
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4292 ((null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4293 ;; logged in proceed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4294 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4295
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4296 ((and (or (string-equal "530 " code) (string-equal "421 " code))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4297 (efs-anonymous-p user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4298 (or (string-match efs-too-many-users-msgs (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4299 (string-match efs-too-many-users-msgs (nth 2 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4300 (if (save-window-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4301 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4302 (display-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4303 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4304 (y-or-n-p (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4305 "Too many users for %s@%s. Try again? "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4306 user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4307 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4308 ;; Set result to nil if we are doing a retry, so done
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4309 ;; message only gets sent once.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4310 (setq result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4311 (if (string-equal code "530 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4312 (efs-login-send-user host user proc gate t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4313 (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4314 (signal 'quit nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4315
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4316 ((and retry (string-equal code "421 "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4317 (setq result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4318 (efs-get-process host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4319
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4320 (t ; bombed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4321 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4322 ;; Wrong username?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4323 (efs-set-user host nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4324 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4325 (concat "USER request failed: " (nth 1 result)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4326 (and (null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4327 (stringp (nth 2 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4328 (message "%sdone%s" msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4329 (let ((n (efs-occur-in-string ?\n (nth 2 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4330 (if (> n 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4331 (format "; MOTD of %d lines" n)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4332 "")))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4333
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4334 (defun efs-login-send-pass (host user proc &optional gate)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4335 "Sends password to HOST and USER. PROC is the ftp client process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4336 Doesn't call efs-save-match data. You must do that yourself."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4337 ;; Note that efs-get-password always returns something.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4338 ;; It prompts the user if necessary. Even if the returned password is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4339 ;; \"\", send it, because we wouldn't be running this function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4340 ;; if the server wasn't insisting on a password.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4341 (let* ((pass "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4342 (qpass "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4343 (cmd "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4344 (result (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4345 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4346 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4347 (setq pass (efs-get-passwd host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4348 (quit (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4349 (kill-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4350 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4351 (signal 'quit nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4352 (setq cmd (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4353 "quote pass "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4354 (setq qpass (efs-quote-string nil pass t))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4355 (efs-raw-send-cmd proc cmd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4356 (fillarray pass 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4357 (fillarray qpass 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4358 (fillarray cmd 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4359 (code (and (>= (length (nth 1 result)) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4360 (substring (nth 1 result) 0 4))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4361 (or code (setq code ""))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4362 ;; Analyze the result.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4363 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4364 ((string-equal code "332 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4365 ;; require an account passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4366 (setq result (efs-login-send-acct host user proc gate)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4367 ((null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4368 ;; logged in proceed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4369 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4370 ((or (string-equal code "530 ") (string-equal code "421 "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4371 ;; Give the user another chance
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4372 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4373 (if (efs-anonymous-p user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4374 (if (or (string-match efs-too-many-users-msgs (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4375 (string-match efs-too-many-users-msgs (nth 2 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4376 (if (save-window-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4377 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4378 (display-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4379 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4380 (y-or-n-p (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4381 "Too many users for %s@%s. Try again? "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4382 user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4383 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4384 ;; Return nil if we are doing a retry, so done
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4385 ;; message only gets sent once.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4386 (setq result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4387 (if (string-equal code "530 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4388 (efs-login-send-user host user proc gate)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4389 (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4390 (signal 'quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4391 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4392 (efs-set-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4393 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4394 (save-window-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4395 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4396 (display-buffer (process-buffer proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4397 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4398 (setq pass
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4399 (read-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4400 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4401 "Password for %s@%s failed. Try again: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4402 user host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4403 (fillarray pass 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4404 (setq result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4405 (efs-login-send-user host user proc gate))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4406 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4407 (efs-set-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4408 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4409 (setq pass
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4410 (read-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4411 (format "Password for %s@%s failed. Try again: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4412 user host))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4413 (fillarray pass 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4414 (setq result nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4415 (efs-login-send-user host user proc gate))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4416 (quit (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4417 (efs-set-user host nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4418 (efs-set-passwd host user nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4419 (signal 'quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4420 (error (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4421 (efs-set-user host nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4422 (efs-set-passwd host user nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4423 (efs-error host user "PASS request failed."))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4424 (t ; bombed for unexplained reasons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4425 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4426 (efs-error host user (concat "PASS request failed: " (nth 1 result)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4427 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4428
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4429 (defun efs-login-send-acct (host user proc &optional gate)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4430 "Sends account password to HOST and USER. PROC is the ftp client process.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4431 Doesn't call efs-save-match data. You must do that yourself."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4432 (let* ((acct "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4433 (qacct "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4434 (cmd "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4435 (result (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4436 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4437 ;; The raptor gateway requires us to send a gateway
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4438 ;; authentication password for account. What if the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4439 ;; remote server wants one too?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4440 (setq acct (if (eq gate 'raptor)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4441 (efs-get-account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4442 efs-gateway-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4443 (nth 3 efs-gateway-type) nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4444 (efs-get-account host user nil t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4445 qacct (efs-quote-string nil acct t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4446 cmd (concat "quote acct " qacct))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4447 (efs-raw-send-cmd proc cmd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4448 (fillarray acct 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4449 (fillarray qacct 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4450 (fillarray cmd 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4451 ;; Analyze the result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4452 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4453 ((null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4454 ;; logged in proceed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4455 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4456 ((eq (car result) 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4457 ;; Give the user another chance
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4458 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4459 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4460 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4461 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4462 (setq acct (read-passwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4463 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4464 "Account password for %s@%s failed. Try again: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4465 user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4466 (or (and efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4467 (string-match efs-high-security-hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4468 (format "%s@%s" user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4469 (efs-set-account host user nil acct)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4470 (fillarray acct 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4471 (setq result (efs-login-send-user host user proc gate)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4472 (quit (condition-case nil (delete-process proc) (error nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4473 (error (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4474 (efs-error host user "ACCT request failed."))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4475 (t ; bombed for unexplained reasons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4476 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4477 (efs-error host user (concat "ACCT request failed: " (nth 1 result)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4478 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4479
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4480 ;;;; ----------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4481 ;;;; Changing working directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4482 ;;;; ----------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4483
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4484 (defun efs-raw-send-cd (host user dir &optional no-error)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4485 ;; If NO-ERROR, doesn't barf, but just returns success (t) or failure (nil).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4486 ;; This does not use efs-send-cmd.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4487 ;; Also DIR must be in the syntax of the remote host-type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4488 (let* ((cmd (concat "cd " dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4489 cd-result cd-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4490 (efs-raw-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4491 (efs-get-process host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4492 cmd nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4493 (efs-cont (result line cont-lines) (cmd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4494 (if (eq result 'fatal)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4495 (efs-raw-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4496 (efs-get-process host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4497 cmd nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4498 (function (lambda (result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4499 (setq cd-result result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4500 cd-line line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4501 (setq cd-result result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4502 cd-line line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4503 (if no-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4504 (null cd-result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4505 (if cd-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4506 (efs-error host user (concat "CD failed: " cd-line))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4507
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4508 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4509 ;;;; Getting a PWD.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4510 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4511
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4512 (defun efs-unquote-quotes (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4513 ;; Unquote \"\"'s in STRING to \".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4514 (let ((start 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4515 new)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4516 (while (string-match "\"\"" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4517 (setq new (concat new (substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4518 string start (1+ (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4519 start (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4520 (if new
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4521 (concat new (substring string start))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4522 string)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4523
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4524 (efs-defun efs-send-pwd nil (host user &optional xpwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4525 "Attempts to get the current working directory for the given HOST/USER pair.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4526 Returns \( DIR . LINE \) where DIR is either the directory or NIL if not found,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4527 and LINE is the relevant success or fail line from the FTP-server. If the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4528 optional arg XPWD is given, uses this server command instead of PWD."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4529 (let* ((result (efs-send-cmd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4530 (list 'quote (if xpwd 'xpwd 'pwd))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4531 "Getting pwd"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4532 (line (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4533 dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4534 (or (car result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4535 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4536 (if (string-match "\"\\(.*\\)\"[^\"]*$" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4537 (setq dir (efs-unquote-quotes (substring line (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4538 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4539 (if (string-match " \\([^ ]+\\) " line) ; stone-age servers!
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4540 (setq dir (substring line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4541 (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4542 (match-end 1)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4543 (cons dir line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4544
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4545 (efs-defun efs-send-pwd super-dumb-unix (host user &optional xpwd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4546 ;; Guess at the pwd for a unix host that doesn't support pwd.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4547 (if (efs-anonymous-p user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4548 ;; guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4549 (cons "/" "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4550 ;; Who knows?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4551 (message "Can't obtain pwd for %s" host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4552 (ding)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4553 (sleep-for 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4554 (message "All file names must be specified as full paths.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4555 (cons nil "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4556
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4557 ;;;; --------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4558 ;;;; Getting the SIZE of a remote file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4559 ;;;; --------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4560
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4561 (defun efs-send-size (host user file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4562 "For HOST and USER, get the size of FILE in bytes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4563 This returns a list \( SIZE . LINE \), where SIZE is the file size in bytes,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4564 or nil if this couldn't be determined, and LINE is the output line of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4565 FTP server."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4566 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4567 (let ((result (efs-send-cmd host user (list 'quote 'size file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4568 (setcar result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4569 (and (null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4570 (string-match "^213 +\\([0-9]+\\)$" (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4571 (string-to-int
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4572 (substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4573 (cdr result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4574 (match-beginning 1) (match-end 1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4575 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4576
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4577 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4578 ;;;; umask support
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4579 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4580
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4581 (defun efs-umask (user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4582 "Returns the umask that efs will use for USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4583 If USER is root or anonymous, then the values of efs-root-umask
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4584 and efs-anonymous-umask, respectively, take precedence, to be followed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4585 by the value of efs-umask, and if this is nil, it returns your current
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4586 umask on the local machine. Returns nil if this can't be determined."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4587 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4588 (and (string-equal user "root") efs-root-umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4589 (and (efs-anonymous-p user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4590 efs-anonymous-umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4591 efs-umask
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4592 (let* ((shell (or (and (boundp 'explicit-shell-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4593 explicit-shell-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4594 (getenv "ESHELL")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4595 (getenv "SHELL")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4596 "/bin/sh"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4597 (default-major-mode 'fundamental-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4598 (default-directory exec-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4599 (buff (get-buffer-create " *efs-umask-data*")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4600 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4601 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4602 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4603 (call-process shell nil buff nil "-c" "umask")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4604 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4605 (if (re-search-forward "[0-7]?[0-7]?[0-7]" nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4606 (string-to-int (buffer-substring (match-beginning 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4607 (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4608 (kill-buffer buff)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4609
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4610 (defun efs-send-umask (host user mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4611 "Sets the umask on HOST for USER to MASK.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4612 Returns t for success, nil for failure."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4613 (interactive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4614 (let* ((path (or buffer-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4615 (and (eq major-mode 'dired-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4616 dired-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4617 (parsed (and path (efs-ftp-path path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4618 (default-host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4619 (default-user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4620 (default-mask (efs-umask default-user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4621 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4622 (read-string "Host: " default-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4623 (read-string "User: " default-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4624 (read-string "Umask: " (int-to-string default-mask)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4625 (let (int-mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4626 (if (integerp mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4627 (setq int-mask mask
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4628 mask (int-to-string mask))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4629 (setq int-mask (string-to-int mask)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4630 (or (string-match "^ *[0-7]?[0-7]?[0-7] *$" mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4631 (error "Invalid umask %s" mask))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4632 (efs-send-cmd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4633 (list 'quote 'site 'umask mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4634 (concat "Setting umask to " mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4635 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4636 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4637 (lambda (int-mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4638 (let ((buff (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4639 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4640 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4641 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4642 (setq efs-process-umask int-mask))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4643 int-mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4644 (efs-cont (result line cont-lines) (host user mask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4645 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4646 (let ((buff (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4647 (efs-set-host-property host 'umask-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4648 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4649 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4650 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4651 (setq efs-process-umask nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4652 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4653 "Unable to set umask to %s on %s" mask host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4654 (if efs-ding-on-umask-failure
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4655 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4656 (ding)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4657 (sit-for 1))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4658 0))) ; Do this NOWAIT = 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4659
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4660 (defun efs-set-umask (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4661 "Sets the umask for HOST and USER, if it has not already been set."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4662 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4663 (set-buffer (process-buffer (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4664 (if (or efs-process-umask (efs-get-host-property host 'umask-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4665 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4666 (let ((umask (efs-umask user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4667 (efs-send-umask host user umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4668 t)))) ; Tell the caller that we did something.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4669
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4670 (defun efs-modes-from-umask (umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4671 ;; Given the 3 digit octal integer umask, returns the decimal integer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4672 ;; according to chmod that a file would be written with.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4673 ;; Assumes only ordinary files, so ignores x bits.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4674 (let* ((others (% umask 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4675 (umask (/ umask 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4676 (group (% umask 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4677 (umask (/ umask 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4678 (owner (% umask 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4679 (factor 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4680 (apply '+
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4681 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4682 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4683 (lambda (x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4684 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4685 (* factor (- 6 (- x (% x 2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4686 (setq factor (* factor 8)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4687 (list others group owner)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4688
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4689 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4690 ;;;; Idle time manipulation.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4691 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4692
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4693 (defun efs-check-idle (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4694 ;; We just toss it in the queue to run whenever there's time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4695 ;; Just fail quietly if this doesn't work.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4696 (if (and (or efs-maximize-idle efs-expire-ftp-buffers)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4697 (memq (efs-host-type host) efs-idle-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4698 (null (efs-get-host-property host 'idle-failed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4699 (let ((buffname (efs-ftp-process-buffer host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4700 (efs-add-to-queue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4701 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4702 (list '(quote site idle)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4703 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4704 (efs-cont (result line cont-lines) (host user buffname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4705 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4706 (if (and (null result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4707 (string-match efs-idle-msgs line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4708 (let ((max (substring line (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4709 (match-end 2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4710 (if (get-buffer buffname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4711 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4712 (set-buffer buffname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4713 (setq efs-process-idle-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4714 (string-to-int
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4715 (substring line (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4716 (match-end 1))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4717 (if (and efs-maximize-idle
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4718 (not (efs-anonymous-p user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4719 (efs-add-to-queue
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4720 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4721 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4722 (list 'quote 'site 'idle max)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4723 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4724 (efs-cont (result line cont-lines) (buffname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4725 max)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4726 (and (null result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4727 (get-buffer buffname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4728 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4729 (set-buffer buffname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4730 (setq efs-process-idle-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4731 (string-to-int max)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4732 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4733 (efs-set-host-property host 'idle-failed t))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4734 0 nil))))) ; Using NOWAIT = 0 inhibits mode line toggling.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4735
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4736
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4737 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4738 ;;;; Sending the SYST command for system type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4739 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4740
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4741 (defun efs-get-syst (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4742 "Use SYST to get the remote system type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4743 Returns the system type as a string if this succeeds, otherwise nil."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4744 (let* ((result (efs-send-cmd host user '(quote syst)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4745 (line (nth 1 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4746 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4747 (and (null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4748 (string-match efs-syst-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4749 (substring line (match-end 0))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4750
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4751 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4752 ;;;; File transfer representation type support
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4753 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4754
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4755 ;;; Legal representation types are: image, ascii, ebcdic, tenex
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4756
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4757 (efs-defun efs-file-type nil (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4758 ;; Returns the file type for PATH, the full efs path, with filename FILE.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4759 ;; The return value is one of 'text, '8-binary, or '36-binary.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4760 (let ((parsed (efs-ftp-path path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4761 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4762 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4763 ;; There is no special significance to temp names, but we assume that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4764 ;; they exist on an 8-bit byte machine.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4765 ((or (null path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4766 (let ((temp (intern-soft path efs-tmp-name-obarray)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4767 (and temp (memq temp efs-tmp-name-files))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4768 '8-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4769 ((and (null parsed) (file-exists-p path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4770 (efs-local-file-type path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4771 ;; test special hosts
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4772 ((and parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4773 efs-binary-file-host-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4774 (let ((case-fold-search t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4775 (string-match efs-binary-file-host-regexp (car parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4776 '8-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4777 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4778 ;; Test file names
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4779 (let ((file (efs-internal-file-name-nondirectory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4780 (or (nth 2 parsed) path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4781 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4782 ;; test for PDP-10 binaries
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4783 ((and efs-36-bit-binary-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4784 (string-match efs-36-bit-binary-file-name-regexp file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4785 '36-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4786 ((and efs-binary-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4787 (string-match efs-binary-file-name-regexp file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4788 '8-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4789 ((and efs-text-file-name-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4790 (string-match efs-text-file-name-regexp file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4791 'text)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4792 ;; by default
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4793 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4794 '8-binary))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4795
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4796 (efs-define-fun efs-local-file-type (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4797 ;; Looks at the beginning (magic-cookie) of a local file to determine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4798 ;; if it is a text file or not. If it's not a text file, it doesn't care
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4799 ;; about what type of binary file, so this doesn't really look for a magic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4800 ;; cookie.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4801 ;; Doesn't call efs-save-match-data. The caller should do so.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4802 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4803 (set-buffer (get-buffer-create efs-data-buffer-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4804 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4805 (insert-file-contents file nil 0 16)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4806 (if (looking-at "[ -~\n\r\C-L]*\\'")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4807 'text
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4808 '8-binary)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4809
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4810 (defun efs-rationalize-file-type (f-type t-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4811 ;; When the original and new names for a file indicate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4812 ;; different file types, this function applies an ad hoc heuristic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4813 ;; to return a single file type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4814 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4815 ((eq f-type t-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4816 f-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4817 ((memq '36-binary (list f-type t-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4818 '36-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4819 ((memq '8-binary (list f-type t-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4820 '8-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4821 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4822 'text)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4823
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4824 (defun efs-prompt-for-transfer-type (arg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4825 "Toggles value of efs-prompt-for-transfer-type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4826 With prefix arg, turns prompting on if arg is positive, otherwise turns
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4827 prompting off."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4828 (interactive "P")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4829 (if (if arg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4830 (> (prefix-numeric-value arg) 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4831 (null efs-prompt-for-transfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4832 ;; turn prompting on
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4833 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4834 (setq efs-prompt-for-transfer-type t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4835 (message "Prompting for FTP transfer TYPE is on."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4836 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4837 (setq efs-prompt-for-transfer-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4838 (message "Prompting for FTP transfer TYPE is off."))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4839
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4840 (defun efs-read-xfer-type (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4841 ;; Prompt for the transfer type to use for PATH
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4842 (let ((type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4843 (completing-read
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4844 (format "FTP transfer TYPE for %s: " (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4845 '(("binary") ("image") ("ascii") ("ebcdic") ("tenex"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4846 nil t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4847 (if (string-equal type "binary")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4848 'image
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4849 (intern type))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4850
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4851 (defun efs-xfer-type (f-host-type f-path t-host-type t-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4852 &optional via-local)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4853 ;; Returns the transfer type for transferring a file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4854 ;; F-HOST-TYPE = the host type of the machine on which the file is from.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4855 ;; F-PATH = path, in full efs-syntax, of the original file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4856 ;; T-HOST-TYPE = host-type of the machine to which the file is being
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4857 ;; transferred.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4858 ;; VIA-LOCAL = non-nil of the file is being moved through the local, or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4859 ;; a gateway machine.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4860 ;; Set F-PATH or T-PATH to nil, to indicate that the file is being
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4861 ;; transferred from/to a temporary file, whose name has no significance.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4862 (let (temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4863 (and f-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4864 (setq temp (intern-soft f-path efs-tmp-name-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4865 (memq temp efs-tmp-name-files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4866 (setq f-path nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4867 (and t-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4868 (setq temp (intern-soft t-path efs-tmp-name-obarray))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4869 (memq temp efs-tmp-name-files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4870 (setq t-path nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4871 (if (or (null (or f-host-type t-host-type)) (null (or f-path t-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4872 'image ; local copy?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4873 (if efs-prompt-for-transfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4874 (efs-read-xfer-type (if f-path f-path t-path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4875 (let ((f-fs (cdr (assq f-host-type efs-file-type-alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4876 (t-fs (cdr (assq t-host-type efs-file-type-alist))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4877 (if (and f-fs t-fs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4878 (if efs-treat-crlf-as-nl
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4879 (and (eq (car f-fs) (car t-fs))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4880 (eq (nth 1 f-fs) (nth 1 t-fs))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4881 (let ((f2-fs (nth 2 f-fs))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4882 (t2-fs (nth 2 t-fs)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4883 (or (eq f2-fs t2-fs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4884 (and (memq f2-fs '(file-crlf file-nl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4885 (memq t2-fs '(file-crlf file-nl))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4886 (equal f-fs t-fs)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4887 'image
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4888 (let ((type (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4889 ((and f-path t-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4890 (efs-rationalize-file-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4891 (efs-file-type t-host-type t-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4892 (efs-file-type f-host-type f-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4893 (f-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4894 (efs-file-type f-host-type f-path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4895 (t-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4896 (efs-file-type t-host-type t-path)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4897 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4898 ((eq type '36-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4899 'image)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4900 ((eq type '8-binary)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4901 (if (or (eq (car f-fs) '36-bit-wa)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4902 (eq (car t-fs) '36-bit-wa))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4903 'tenex
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4904 'image))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4905 (t ; handles 'text
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4906 (if (and t-fs f-fs (eq (nth 1 f-fs) 'ebcdic)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4907 (eq (nth 1 t-fs) 'ebcdic) (null via-local))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4908 'ebcdic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4909 'ascii)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4910
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4911 (defun efs-set-xfer-type (host user type &optional clientless)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4912 ;; Sets the xfer type for HOST and USER to TYPE.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4913 ;; If the connection is already using the required type, does nothing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4914 ;; If clientless is non-nil, we are using a quoted xfer command, and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4915 ;; need to check if the client has changed things.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4916 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4917 (let ((buff (process-buffer (efs-get-process host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4918 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4919 (or (if (and clientless efs-process-client-altered-xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4920 (or (eq type efs-process-client-altered-xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4921 (setq efs-process-client-altered-xfer-type nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4922 ;; We are sending a non-clientless command, so the client
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4923 ;; gets back in synch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4924 (setq efs-process-client-altered-xfer-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4925 (and efs-process-xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4926 (eq type efs-process-xfer-type)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4927 (let ((otype efs-process-xfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4928 ;; Set this now in anticipation that the TYPE command will work,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4929 ;; in case other commands, such as efs-set-hash-mark-unit want to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4930 ;; grok this before the TYPE command completes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4931 (setq efs-process-xfer-type type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4932 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4933 host user (list 'type type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4934 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4935 (efs-cont (result line cont-lines) (host user type otype buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4936 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4937 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4938 (efs-error host user (format "TYPE %s failed: %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4939 (upcase (symbol-name type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4940 line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4941 (if (get-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4942 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4943 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4944 (setq efs-process-xfer-type otype))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4945 0)))))) ; always send type commands NOWAIT = 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4946
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4947
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4948 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4949 ;;;; Obtaining DIR listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4950 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4951
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4952 (defun efs-ls-guess-switches ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4953 ;; Tries to determine what would be the most useful switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4954 ;; to use for a DIR listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4955 (if (and (boundp 'dired-listing-switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4956 (stringp dired-listing-switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4957 (efs-parsable-switches-p dired-listing-switches t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4958 dired-listing-switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4959 "-al"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4960
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4961 (efs-defun efs-ls-dumb-check nil (line host file path lsargs msg noparse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4962 noerror nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4963 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4964
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4965 (efs-defun efs-ls-dumb-check unknown (line host file path lsargs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4966 msg noparse noerror nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4967 ;; Checks to see if the host type might be dumb unix. If so, returns the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4968 ;; listing otherwise nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4969 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4970 lsargs
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4971 (string-match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4972 ;; Some CMU servers return a 530 here. 550 is correct.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4973 (concat "^5[35]0 \\(The file \\)?"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4974 (regexp-quote (concat lsargs " " path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4975 ;; 550 is for a non-accessible file -- RFC959
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4976 line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4977 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4978 (if (eq (efs-host-type host) 'apollo-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4979 (efs-add-host 'dumb-apollo-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4980 (efs-add-host 'dumb-unix host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4981 ;; try again
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4982 (if nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4983 t ; return t if asynch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4984 ; This is because dumb-check can't run asynch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4985 ; This means that we can't recognize dumb hosts asynch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4986 ; Shouldn't be a problem.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4987 (efs-ls file nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4988 (if (eq msg t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4989 (format "Relisting %s" (efs-relativize-filename file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4990 msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4991 noparse noerror nowait cont)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4992
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4993 ;; With no-error nil, this function returns:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4994 ;; an error if file is not an efs-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4995 ;; (This should never happen.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4996 ;; an error if either the listing is unreadable or there is an ftp error.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4997 ;; the listing (a string), if everything works.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4998 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
4999 ;; With no-error t, it returns:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5000 ;; an error if not an efs-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5001 ;; error if listing is unreable (most likely caused by a slow connection)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5002 ;; nil if ftp error (this is because although asking to list a nonexistent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5003 ;; directory on a remote unix machine usually (except
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5004 ;; maybe for dumb hosts) returns an ls error, but no
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5005 ;; ftp error, if the same is done on a VMS machine,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5006 ;; an ftp error is returned. Need to trap the error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5007 ;; so we can go on and try to list the parent.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5008 ;; the listing, if everything works.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5009
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5010 (defun efs-ls (file lsargs msg &optional noparse noerror nowait cont nlist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5011 "Return the output of a `DIR' or `ls' command done over ftp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5012 FILE is the full name of the remote file, LSARGS is any args to pass to the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5013 `ls' command. MSG is a message to be displayed while listing, if MSG is given
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5014 as t, a suitable message will be computed. If nil, no message will be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5015 displayed. If NOPARSE is non-nil, then the listing will not be parsed and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5016 stored in internal cache. Otherwise, the listing will be parsed, if LSARGS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5017 allow it. If NOERROR is non-nil, then we return nil if the listing fails,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5018 rather than signal an error. If NOWAIT is non-nil, we do the listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5019 asynchronously, returning nil. If CONT is non-nil it is called with first
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5020 argument the listing string."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5021 ;; If lsargs are nil, this forces a one-time only dumb listing using dir.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5022 (setq file (efs-expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5023 (let ((parsed (efs-ftp-path file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5024 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5025 (let* ((host (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5026 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5027 (path (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5028 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5029 (listing-type (efs-listing-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5030 (parse (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5031 ((null noparse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5032 (efs-parsable-switches-p lsargs t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5033 ((eq noparse 'parse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5034 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5035 (t nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5036 (switches lsargs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5037 cache)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5038
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5039 (if (memq host-type efs-dumb-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5040 (setq lsargs nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5041 (if (and (null efs-ls-uncache)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5042 (setq cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5043 (or (efs-get-from-ls-cache file switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5044 (and switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5045 (efs-convert-from-ls-cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5046 file switches host-type listing-type)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5047 ;; The listing is in the mail, errr... cache.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5048 (let (listing)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5049 (if (stringp cache)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5050 (setq listing cache)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5051 (setq listing (car cache))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5052 (if (and parse (null (nth 1 cache)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5053 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5054 (set-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5055 (let ((default-major-mode 'fundamental-mode))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5056 (get-buffer-create
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5057 efs-data-buffer-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5058 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5059 (insert listing)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5060 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5061 (efs-set-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5062 file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5063 (efs-parse-listing listing-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5064 host user path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5065 file lsargs))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5066 ;; Note that we have parsed it now.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5067 (setcar (cdr cache) t))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5068 (if cont (efs-call-cont cont listing))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5069 listing)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5070
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5071 (if cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5072 (efs-del-from-ls-cache file nil nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5073 ;; Need to get the listing via FTP.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5074 (let* ((temp (efs-make-tmp-name host nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5075 (temp-file (car temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5076 listing-result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5077 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5078 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5079 (list (if nlist 'nlist 'dir) path (cdr temp) lsargs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5080 (if (eq msg t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5081 (format "Listing %s" (efs-relativize-filename file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5082 msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5083 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5084 (efs-cont (result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5085 (host-type listing-type host user temp-file path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5086 switches file lsargs noparse parse noerror
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5087 msg nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5088 ;; The client flipped to ascii, remember this.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5089 (let ((buff (get-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5090 (efs-ftp-process-buffer host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5091 (if buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5092 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5093 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5094 (setq efs-process-client-altered-xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5095 'ascii))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5096 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5097 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5098 (or (setq listing-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5099 (efs-ls-dumb-check
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5100 (and (or (eq host-type 'unknown)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5101 (eq listing-type 'unix:unknown))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5102 'unknown)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5103 line host file path lsargs msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5104 noparse noerror nowait cont))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5105 ;; If dumb-check returns non-nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5106 ;; then it would have handled any error recovery
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5107 ;; and conts. listing-result would only be set to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5108 ;; t if nowait was non-nil. Therefore, the final
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5109 ;; return for efs-ls could never be t, even if I
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5110 ;; set listing-result to t here.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5111 (if noerror
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5112 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5113 (efs-call-cont cont nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5114 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5115 (concat "DIR failed: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5116 line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5117
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5118 ;; listing worked
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5119 (if (efs-ftp-path temp-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5120 (efs-add-file-entry (efs-host-type efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5121 temp-file nil nil nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5122 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5123 ;; A hack to get around a jka-compr problem.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5124 ;; Do we still need it?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5125 (let ((default-major-mode 'fundamental-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5126 efs-verbose jka-compr-enabled)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5127 (set-buffer (get-buffer-create
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5128 efs-data-buffer-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5129 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5130 (if (or (file-readable-p temp-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5131 (sleep-for efs-retry-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5132 (file-readable-p temp-file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5133 (insert-file-contents temp-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5134 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5135 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5136 "list data file %s not readable"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5137 temp-file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5138 (if parse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5139 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5140 (efs-set-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5141 file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5142 (efs-parse-listing listing-type host user path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5143 file lsargs))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5144 ;; Parsing may update the host type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5145 (and lsargs (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5146 efs-dumb-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5147 (setq lsargs nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5148 (let ((listing (buffer-string)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5149 (efs-add-to-ls-cache file lsargs listing parse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5150 (if (and (null lsargs) switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5151 ;; Try to convert
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5152 (let ((conv (efs-get-ls-converter switches)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5153 (and conv
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5154 (setq conv (assoc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5155 (char-to-string 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5156 conv))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5157 (funcall (cdr conv) listing-type nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5158 (setq listing (buffer-string)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5159 (or nowait (setq listing-result listing))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5160 ;; Call the ls cont, with first arg the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5161 ;; listing string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5162 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5163 (efs-call-cont cont listing)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5164 (efs-del-tmp-name temp-file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5165 nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5166 (and (null nowait) listing-result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5167 (error "Attempt to get a remote listing for the local file %s" file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5168
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5169
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5170 ;;;; ===============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5171 ;;;; >7
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5172 ;;;; Parsing and storing remote file system data.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5173 ;;;; ===============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5174
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5175 ;;; The directory listing parsers do some host type guessing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5176 ;;; Most of the host type guessing is done when the PWD output
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5177 ;;; is parsed. A bit is done when the error codes for DIR are
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5178 ;;; analyzed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5179
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5180 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5181 ;;;; Caching directory listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5182 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5183
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5184 ;;; Aside from storing files data in a hashtable, a limited number
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5185 ;;; of listings are stored in complete form in `efs-ls-cache'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5186
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5187 (defun efs-del-from-ls-cache (file &optional parent-p dir-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5188 ;; Deletes from the ls cache the listing for FILE.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5189 ;; With optional PARENT-P, deletes any entry for the parent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5190 ;; directory of FILE too.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5191 ;; If DIR-P is non-nil, then the directory listing of FILE is to be deleted.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5192 (if dir-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5193 (setq file (file-name-as-directory file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5194 (setq file (directory-file-name file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5195 (setq file (efs-canonize-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5196 (if parent-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5197 (setq parent-p (file-name-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5198 (if dir-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5199 (directory-file-name file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5200 file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5201 (setq efs-ls-cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5202 (delq nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5203 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5204 (if parent-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5205 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5206 (lambda (x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5207 (let ((f-ent (car x)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5208 (and (not (string-equal file f-ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5209 (not (string-equal parent-p f-ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5210 x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5211 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5212 (lambda (x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5213 (and (not (string-equal file (car x)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5214 x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5215 efs-ls-cache))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5216
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5217 (defun efs-wipe-from-ls-cache (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5218 ;; Remove from efs-ls-cache all listings for HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5219 (let ((host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5220 (case-insens (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5221 efs-case-insensitive-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5222 (if case-insens (setq user (downcase user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5223 (setq efs-ls-cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5224 (delq nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5225 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5226 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5227 (lambda (x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5228 (let ((parsed (efs-ftp-path (car x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5229 (and (not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5230 (and (string-equal (car parsed) host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5231 (string-equal (if case-insens
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5232 (downcase (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5233 (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5234 user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5235 x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5236 efs-ls-cache)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5237
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5238 (defun efs-get-from-ls-cache (file switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5239 ;; Returns the value in `ls-cache' for FILE and SWITCHES.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5240 ;; Returns a list consisting of the listing string, and whether its
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5241 ;; already been parsed. This list is eq to the nthcdr 2 of the actual
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5242 ;; cache entry, so you can setcar it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5243 ;; For dumb listings, SWITCHES will be nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5244 (let ((list efs-ls-cache)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5245 (switches (efs-canonize-switches switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5246 (file (efs-canonize-file-name file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5247 (catch 'done
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5248 (while list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5249 (if (and (string-equal file (car (car list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5250 (string-equal switches (nth 1 (car list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5251 (throw 'done (nthcdr 2 (car list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5252 (setq list (cdr list)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5253
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5254 (defun efs-add-to-ls-cache (file switches listing parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5255 ;; Only call after efs-get-from-cache returns nil, to avoid duplicate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5256 ;; entries. PARSED should be t, if the listing has already been parsed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5257 (and (> efs-ls-cache-max 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5258 (let ((switches (efs-canonize-switches switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5259 (file (efs-canonize-file-name file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5260 (if (= efs-ls-cache-max 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5261 (setq efs-ls-cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5262 (list (list file switches listing parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5263 (if (>= (length efs-ls-cache) efs-ls-cache-max)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5264 (setcdr (nthcdr (- efs-ls-cache-max 2) efs-ls-cache) nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5265 (setq efs-ls-cache (cons (list file switches listing parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5266 efs-ls-cache))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5267
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5268 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5269 ;;;; Converting listings from cache.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5270 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5271
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5272 (defun efs-get-ls-converter (to-switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5273 ;; Returns converter alist for TO-SWITCHES
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5274 (efs-get-hash-entry (efs-canonize-switches to-switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5275 efs-ls-converter-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5276
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5277 (defun efs-add-ls-converter (to-switches from-switches converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5278 ;; Adds an entry to `efs-ls-converter-hashtable'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5279 ;; If from-switches is t, the converter converts from internal files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5280 ;; hashtable.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5281 (let* ((to-switches (efs-canonize-switches to-switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5282 (ent (efs-get-hash-entry to-switches efs-ls-converter-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5283 (add (cons (or (eq from-switches t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5284 (efs-canonize-switches from-switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5285 converter)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5286 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5287 (or (member add ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5288 (nconc ent (list add)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5289 (efs-put-hash-entry to-switches (list add) efs-ls-converter-hashtable))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5290
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5291 (defun efs-convert-from-ls-cache (file switches host-type listing-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5292 ;; Returns a listing by converting the switches from a cached listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5293 (let ((clist (efs-get-ls-converter switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5294 (dir-p (= ?/ (aref file (1- (length file)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5295 elt listing result regexp alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5296 (while file ; this loop will iterate at most twice.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5297 (setq alist clist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5298 (while alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5299 (setq elt (car alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5300 (if (eq (car elt) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5301 (if (and dir-p (setq result (funcall (cdr elt) host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5302 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5303 (efs-get-files file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5304 regexp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5305 (setq alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5306 file nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5307 (setq alist (cdr alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5308 (if (and (setq listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5309 (efs-get-from-ls-cache file (car elt)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5310 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5311 (set-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5312 (let ((default-major-mode 'fundamental-mode))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5313 (get-buffer-create efs-data-buffer-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5314 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5315 (insert (car listing))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5316 (and (funcall (cdr elt) listing-type regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5317 (setq result (buffer-string)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5318 (setq alist nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5319 file nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5320 (setq alist (cdr alist)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5321 ;; Look for wildcards.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5322 (if (and file (null dir-p) (null regexp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5323 (setq regexp (efs-shell-regexp-to-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5324 (file-name-nondirectory file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5325 file (file-name-directory file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5326 dir-p t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5327 (setq file nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5328 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5329
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5330 ;;; Define some converters
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5331
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5332 (defun efs-unix-t-converter-sort-pred (elt1 elt2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5333 (let* ((data1 (car elt1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5334 (data2 (car elt2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5335 (year1 (car data1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5336 (year2 (car data2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5337 (month1 (nth 1 data1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5338 (month2 (nth 1 data2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5339 (day1 (nth 2 data1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5340 (day2 (nth 2 data2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5341 (hour1 (nth 3 data1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5342 (hour2 (nth 3 data2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5343 (minutes1 (nth 4 data1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5344 (minutes2 (nth 4 data2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5345 (if year1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5346 (and year2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5347 (or (> year1 year2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5348 (and (= year1 year2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5349 (or (> month1 month2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5350 (and (= month1 month2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5351 (> day1 day2))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5352 (if year2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5353 t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5354 (or (> month1 month2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5355 (and (= month1 month2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5356 (or (> day1 day2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5357 (and (= day1 day2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5358 (or (> hour1 hour2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5359 (and (= hour1 hour2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5360 (> minutes1 minutes2)))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5361
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5362 (defun efs-unix-t-converter (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5363 (if regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5364 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5365 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5366 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5367 (if (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5368 (let ((current-month (cdr (assoc (substring
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5369 (current-time-string) 4 7)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5370 efs-month-alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5371 list-start start end list year month day hour minutes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5372 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5373 (setq list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5374 (while (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5375 (setq start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5376 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5377 (setq end (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5378 (goto-char start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5379 (re-search-forward efs-month-and-time-regexp end t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5380 ;; Need to measure wrto the current month
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5381 ;; There is a bug here if because of time-zone shifts, the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5382 ;; local machine and the remote one are on different months.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5383 (setq month (% (+ (- 11 current-month)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5384 (cdr (assoc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5385 (buffer-substring (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5386 (match-end 2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5387 efs-month-alist))) 12)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5388 day (string-to-int
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5389 (buffer-substring (match-beginning 3) (match-end 3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5390 year (buffer-substring (match-beginning 4) (match-end 4)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5391 (if (string-match ":" year)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5392 (setq hour (string-to-int (substring year 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5393 (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5394 minutes (string-to-int (substring year (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5395 year nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5396 (setq hour nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5397 minutes nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5398 year (string-to-int year)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5399 (setq list (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5400 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5401 (list year month day hour minutes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5402 (buffer-substring start end))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5403 list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5404 (goto-char end))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5405 (setq list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5406 (mapcar 'cdr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5407 (sort list 'efs-unix-t-converter-sort-pred)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5408 (if reverse (setq list (nreverse list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5409 (delete-region list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5410 (apply 'insert list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5411 t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5412
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5413 (efs-defun efs-t-converter nil (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5414 ;; Converts listing without the t-switch, to ones with it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5415 nil) ; by default assume that we cannot work.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5416
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5417 (efs-fset 'efs-t-converter 'unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5418 (efs-fset 'efs-t-converter 'sysV-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5419 (efs-fset 'efs-t-converter 'apollo-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5420 (efs-fset 'efs-t-converter 'bsd-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5421 (efs-fset 'efs-t-converter 'dumb-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5422 (efs-fset 'efs-t-converter 'dumb-apollo-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5423 (efs-fset 'efs-t-converter 'super-dumb-unix 'efs-unix-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5424
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5425 (defun efs-rt-converter (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5426 ;; Reverse time sorting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5427 (efs-t-converter listing-type regexp t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5428
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5429 (defun efs-unix-alpha-converter (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5430 (if regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5431 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5432 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5433 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5434 (if (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5435 (let (list list-start end start next)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5436 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5437 (setq list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5438 (while (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5439 (setq start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5440 (end-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5441 (setq end (point)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5442 next (1+ end))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5443 (goto-char start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5444 (re-search-forward efs-month-and-time-regexp end t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5445 ;; Need to measure wrto the current month
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5446 ;; There is a bug here if because of time-zone shifts, the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5447 ;; local machine and the remote one are on different months.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5448 (setq list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5449 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5450 (cons (buffer-substring (point) end)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5451 (buffer-substring start next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5452 list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5453 (goto-char next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5454 (delete-region list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5455 (apply 'insert
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5456 (mapcar 'cdr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5457 (sort list (if reverse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5458 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5459 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5460 (string< (car y) (car x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5461 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5462 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5463 (string< (car x) (car y))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5464 t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5465
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5466 (efs-defun efs-alpha-converter nil (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5467 ;; Converts listing to lexigraphical order.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5468 nil) ; by default assume that we cannot work.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5469
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5470 (efs-fset 'efs-alpha-converter 'unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5471 (efs-fset 'efs-alpha-converter 'sysV-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5472 (efs-fset 'efs-alpha-converter 'apollo-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5473 (efs-fset 'efs-alpha-converter 'bsd-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5474 (efs-fset 'efs-alpha-converter 'dumb-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5475 (efs-fset 'efs-alpha-converter 'dumb-apollo-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5476 (efs-fset 'efs-alpha-converter 'super-dumb-unix 'efs-unix-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5477
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5478 (defun efs-ralpha-converter (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5479 ;; Reverse alphabetic
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5480 (efs-alpha-converter listing-type regexp t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5481
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5482 (defun efs-unix-S-converter (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5483 (if regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5484 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5485 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5486 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5487 (if (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5488 (let (list list-start start next)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5489 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5490 (setq list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5491 (while (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5492 (setq start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5493 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5494 (setq next (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5495 (goto-char start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5496 (re-search-forward efs-month-and-time-regexp next t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5497 ;; Need to measure wrto the current month
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5498 ;; There is a bug here if because of time-zone shifts, the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5499 ;; local machine and the remote one are on different months.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5500 (setq list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5501 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5502 (cons (string-to-int
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5503 (buffer-substring (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5504 (match-end 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5505 (buffer-substring start next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5506 list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5507 (goto-char next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5508 (delete-region list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5509 (apply 'insert
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5510 (mapcar 'cdr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5511 (sort list (if reverse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5512 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5513 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5514 (< (car x) (car y))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5515 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5516 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5517 (> (car x) (car y))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5518 t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5519
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5520 (efs-defun efs-S-converter nil (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5521 ;; Converts listing without the S-switch, to ones with it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5522 nil) ; by default assume that we cannot work.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5523
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5524 (efs-fset 'efs-S-converter 'unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5525 (efs-fset 'efs-S-converter 'sysV-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5526 (efs-fset 'efs-S-converter 'apollo-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5527 (efs-fset 'efs-S-converter 'bsd-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5528 (efs-fset 'efs-S-converter 'dumb-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5529 (efs-fset 'efs-S-converter 'dumb-apollo-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5530 (efs-fset 'efs-S-converter 'super-dumb-unix 'efs-unix-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5531
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5532 (defun efs-rS-converter (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5533 ;; Reverse S switch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5534 (efs-S-converter listing-type regexp t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5535
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5536 (defun efs-unix-X-converter (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5537 (if regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5538 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5539 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5540 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5541 (if (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5542 (let (next list list-start fnstart eol start end link-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5543 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5544 (setq list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5545 (while (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5546 (setq start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5547 (skip-chars-forward "0-9 ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5548 (setq link-p (= (following-char) ?l))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5549 (end-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5550 (setq eol (point)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5551 next (1+ eol))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5552 (goto-char start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5553 (re-search-forward efs-month-and-time-regexp eol t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5554 ;; Need to measure wrto the current month
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5555 ;; There is a bug here if because of time-zone shifts, the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5556 ;; local machine and the remote one are on different months.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5557 (setq fnstart (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5558 (or (and link-p (search-forward " -> " eol t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5559 (goto-char (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5560 (goto-char eol))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5561 (setq end (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5562 (skip-chars-backward "^." fnstart)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5563 (setq list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5564 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5565 (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5566 (if (= (point) fnstart)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5567 ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5568 (buffer-substring (point) end))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5569 (buffer-substring start next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5570 list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5571 (goto-char next))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5572 (delete-region list-start (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5573 (apply 'insert
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5574 (mapcar 'cdr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5575 (sort list (if reverse
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5576 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5577 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5578 (string< (car y) (car x))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5579 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5580 (lambda (x y)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5581 (string< (car x) (car y))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5582 t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5583
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5584 (efs-defun efs-X-converter nil (&optional regexp reverse)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5585 ;; Sort on file name extension. By default do nothing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5586 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5587
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5588 (defun efs-rX-converter (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5589 (efs-X-converter listing-type regexp t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5590
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5591 (efs-fset 'efs-X-converter 'unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5592 (efs-fset 'efs-X-converter 'sysV-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5593 (efs-fset 'efs-X-converter 'apollo-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5594 (efs-fset 'efs-X-converter 'bsd-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5595 (efs-fset 'efs-X-converter 'dumb-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5596 (efs-fset 'efs-X-converter 'dumb-apollo-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5597 (efs-fset 'efs-X-converter 'super-dumb-unix 'efs-unix-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5598
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5599 ;;; Brief listings
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5600
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5601 ;;; The following functions do a heap better at packing than
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5602 ;;; the usual ls listing. A variable column width is used.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5603 (defun efs-column-widths (columns list &optional across)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5604 ;; Returns the column widths for breaking LIST into
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5605 ;; COLUMNS number of columns.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5606 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5607 ((null list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5608 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5609 ((= columns 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5610 (list (apply 'max (mapcar 'length list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5611 ((let* ((len (length list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5612 (col-length (/ len columns))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5613 (remainder (% len columns))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5614 (i 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5615 (j 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5616 (max-width 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5617 widths padding)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5618 (if (zerop remainder)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5619 (setq padding 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5620 (setq col-length (1+ col-length)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5621 padding (- columns remainder)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5622 (setq list (nconc (copy-sequence list) (make-list padding nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5623 (setcdr (nthcdr (1- (+ len padding)) list) list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5624 (while (< i columns)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5625 (while (< j col-length)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5626 (setq max-width (max max-width (length (car list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5627 list (if across (nthcdr columns list) (cdr list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5628 j (1+ j)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5629 (setq widths (cons (+ max-width 2) widths)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5630 max-width 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5631 j 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5632 i (1+ i))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5633 (if across (setq list (cdr list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5634 (setcar widths (- (car widths) 2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5635 (nreverse widths)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5636
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5637 (defun efs-calculate-columns (list &optional across)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5638 ;; Returns a list of integers which are the column widths that best pack
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5639 ;; LIST, a list of strings, onto the screen.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5640 (and list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5641 (let* ((width (1- (window-width)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5642 (columns (max 1 (/ width
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5643 (+ 2 (apply 'max (mapcar 'length list))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5644 col-list last-col-list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5645 (while (<= (apply '+ (setq col-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5646 (efs-column-widths columns list across)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5647 width)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5648 (setq columns (1+ columns)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5649 last-col-list col-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5650 (or last-col-list col-list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5651
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5652 (defun efs-format-columns-of-files (files &optional across)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5653 ;; Returns the number of lines used.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5654 ;; If ACROSS is non-nil, sorts across rather than down the buffer, like
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5655 ;; ls -x
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5656 ;; A beefed up version of the function in dired. Thanks Sebastian.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5657 (and files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5658 (let* ((columns (efs-calculate-columns files across))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5659 (ncols (length columns))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5660 (ncols1 (1- ncols))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5661 (nfiles (length files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5662 (nrows (+ (/ nfiles ncols)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5663 (if (zerop (% nfiles ncols)) 0 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5664 (space-left (- (window-width) (apply '+ columns) 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5665 (stretch (/ space-left ncols1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5666 (float-stretch (if (zerop ncols1) 0 (% space-left ncols1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5667 (i 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5668 (j 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5669 (result "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5670 file padding)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5671 (setq files (nconc (copy-sequence files) ; fill up with empty fns
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5672 (make-list (- (* ncols nrows) nfiles) "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5673 (setcdr (nthcdr (1- (length files)) files) files) ; make circular
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5674 (while (< j nrows)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5675 (while (< i ncols)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5676 (setq result (concat result (setq file (car files))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5677 (setq padding (- (nth i columns) (length file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5678 (or (= i ncols1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5679 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5680 (setq padding (+ padding stretch))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5681 (if (< i float-stretch) (setq padding (1+ padding)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5682 (setq result (concat result (make-string padding ?\ )))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5683 (setq files (if across (cdr files) (nthcdr nrows files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5684 i (1+ i)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5685 (setq result (concat result "\n"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5686 (setq i 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5687 j (1+ j))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5688 (or across (setq files (cdr files))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5689 result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5690
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5691 (defun efs-brief-converter (host-type file-table F a A p x C &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5692 ;; Builds a brief directory listing for file cache, with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5693 ;; possible switches F, a, A, p, x.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5694 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5695 (let (list ent modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5696 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5697 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5698 (lambda (key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5699 (if (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5700 (efs-really-file-p host-type key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5701 (or a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5702 (and A (not (or (string-equal "." key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5703 (string-equal ".." key))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5704 (/= (string-to-char key) ?.))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5705 (or (null regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5706 (string-match regexp key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5707 (setq ent (car val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5708 modes (nth 3 val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5709 list (cons
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5710 (cond ((null (or F p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5711 key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5712 ((eq t ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5713 (concat key "/"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5714 ((cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5715 ((null F)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5716 key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5717 ((stringp ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5718 (concat key "@"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5719 ((null modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5720 key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5721 ((eq (string-to-char modes) ?s)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5722 ;; a socket
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5723 (concat key "="))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5724 ((or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5725 (memq (elt modes 3) '(?x ?s ?t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5726 (memq (elt modes 6) '(?x ?s ?t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5727 (memq (elt modes 9) '(?x ?s ?t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5728 (concat key "*"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5729 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5730 key))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5731 list)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5732 file-table)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5733 (setq list (sort list 'string<))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5734 (if (or C x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5735 (efs-format-columns-of-files list x)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5736 (concat (mapconcat 'identity list "\n") "\n")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5737
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5738 ;;; Store converters.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5739
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5740 ;; The cheaters.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5741 (efs-add-ls-converter "-al" nil (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5742 (lambda (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5743 (null regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5744 (efs-add-ls-converter "-Al" nil (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5745 (lambda (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5746 (null regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5747 (efs-add-ls-converter "-alF" nil (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5748 (lambda (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5749 (null regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5750 (efs-add-ls-converter "-AlF" nil (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5751 (lambda (listing-type &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5752 (null regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5753
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5754 (efs-add-ls-converter "-alt" "-al" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5755 (efs-add-ls-converter "-Alt" "-Al" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5756 (efs-add-ls-converter "-lt" "-l" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5757 (efs-add-ls-converter "-altF" "-alF" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5758 (efs-add-ls-converter "-AltF" "-AlF" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5759 (efs-add-ls-converter "-ltF" "-lF" 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5760 (efs-add-ls-converter "-alt" nil 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5761 (efs-add-ls-converter "-altF" nil 'efs-t-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5762 (efs-add-ls-converter "-Alt" nil 'efs-t-converter) ; cheating a bit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5763 (efs-add-ls-converter "-AltF" nil 'efs-t-converter) ; cheating a bit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5764
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5765 (efs-add-ls-converter "-altr" "-al" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5766 (efs-add-ls-converter "-Altr" "-Al" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5767 (efs-add-ls-converter "-ltr" "-l" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5768 (efs-add-ls-converter "-altFr" "-alF" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5769 (efs-add-ls-converter "-AltFr" "-AlF" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5770 (efs-add-ls-converter "-ltFr" "-lF" 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5771 (efs-add-ls-converter "-altr" nil 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5772 (efs-add-ls-converter "-Altr" nil 'efs-rt-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5773
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5774 (efs-add-ls-converter "-alr" "-alt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5775 (efs-add-ls-converter "-Alr" "-Alt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5776 (efs-add-ls-converter "-lr" "-lt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5777 (efs-add-ls-converter "-alFr" "-alFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5778 (efs-add-ls-converter "-AlFr" "-AlFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5779 (efs-add-ls-converter "-lFr" "-lFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5780
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5781 (efs-add-ls-converter "-al" "-alt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5782 (efs-add-ls-converter "-Al" "-Alt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5783 (efs-add-ls-converter "-l" "-lt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5784 (efs-add-ls-converter "-alF" "-alFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5785 (efs-add-ls-converter "-AlF" "-AlFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5786 (efs-add-ls-converter "-lF" "-lFt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5787 (efs-add-ls-converter nil "-alt" 'efs-alpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5788
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5789 (efs-add-ls-converter "-alr" "-al" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5790 (efs-add-ls-converter "-Alr" "-Al" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5791 (efs-add-ls-converter "-lr" "-l" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5792 (efs-add-ls-converter "-alFr" "-alF" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5793 (efs-add-ls-converter "-lAFr" "-lAF" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5794 (efs-add-ls-converter "-lFr" "-lF" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5795 (efs-add-ls-converter "-alr" nil 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5796
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5797 (efs-add-ls-converter "-alr" "-alt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5798 (efs-add-ls-converter "-Alr" "-Alt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5799 (efs-add-ls-converter "-lr" "-lt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5800 (efs-add-ls-converter "-alFr" "-alFt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5801 (efs-add-ls-converter "-lAFr" "-lAFt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5802 (efs-add-ls-converter "-lFr" "-lFt" 'efs-ralpha-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5803
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5804 (efs-add-ls-converter "-alS" "-al" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5805 (efs-add-ls-converter "-AlS" "-Al" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5806 (efs-add-ls-converter "-lS" "-l" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5807 (efs-add-ls-converter "-alSF" "-alF" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5808 (efs-add-ls-converter "-AlSF" "-AlF" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5809 (efs-add-ls-converter "-lSF" "-lF" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5810 (efs-add-ls-converter "-alS" nil 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5811
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5812 (efs-add-ls-converter "-alSr" "-al" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5813 (efs-add-ls-converter "-AlSr" "-Al" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5814 (efs-add-ls-converter "-lSr" "-l" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5815 (efs-add-ls-converter "-alSFr" "-alF" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5816 (efs-add-ls-converter "-AlSFr" "-AlF" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5817 (efs-add-ls-converter "-lSFr" "-lF" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5818 (efs-add-ls-converter "-alSr" nil 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5819
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5820 (efs-add-ls-converter "-alS" "-alt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5821 (efs-add-ls-converter "-AlS" "-Alt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5822 (efs-add-ls-converter "-lS" "-lt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5823 (efs-add-ls-converter "-alSF" "-alFt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5824 (efs-add-ls-converter "-AlSF" "-AlFt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5825 (efs-add-ls-converter "-lSF" "-lFt" 'efs-S-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5826
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5827 (efs-add-ls-converter "-alSr" "-alt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5828 (efs-add-ls-converter "-AlSr" "-Alt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5829 (efs-add-ls-converter "-lSr" "-lt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5830 (efs-add-ls-converter "-alSFr" "-alFt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5831 (efs-add-ls-converter "-AlSFr" "-AlFt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5832 (efs-add-ls-converter "-lSFr" "-lFt" 'efs-rS-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5833
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5834 (efs-add-ls-converter "-AlX" nil 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5835 (efs-add-ls-converter "-alX" nil 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5836 (efs-add-ls-converter "-AlXr" nil 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5837 (efs-add-ls-converter "-alXr" nil 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5838
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5839 (efs-add-ls-converter "-alX" "-al" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5840 (efs-add-ls-converter "-AlX" "-Al" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5841 (efs-add-ls-converter "-lX" "-l" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5842 (efs-add-ls-converter "-alXF" "-alF" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5843 (efs-add-ls-converter "-AlXF" "-AlF" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5844 (efs-add-ls-converter "-lXF" "-lF" 'efs-X-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5845
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5846 (efs-add-ls-converter "-alXr" "-al" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5847 (efs-add-ls-converter "-AlXr" "-Al" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5848 (efs-add-ls-converter "-lXr" "-l" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5849 (efs-add-ls-converter "-alXFr" "-alF" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5850 (efs-add-ls-converter "-AlXFr" "-AlF" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5851 (efs-add-ls-converter "-lXFr" "-lF" 'efs-rX-converter)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5852
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5853 ;;; Converters for efs-files-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5854
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5855 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5856 "" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5857 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5858 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5859 nil nil nil nil nil nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5860 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5861 "-C" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5862 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5863 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5864 nil nil nil nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5865 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5866 "-F" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5867 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5868 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5869 t nil nil nil nil nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5870 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5871 "-p" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5872 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5873 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5874 nil nil nil t nil nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5875 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5876 "-CF" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5877 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5878 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5879 t nil nil nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5880 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5881 "-Cp" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5882 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5883 (efs-brief-converter host-type files nil nil nil t nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5884 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5885 "-x" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5886 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5887 (efs-brief-converter host-type files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5888 nil nil nil nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5889 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5890 "-xF" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5891 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5892 (efs-brief-converter host-type files t nil nil nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5893 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5894 "-xp" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5895 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5896 (efs-brief-converter host-type files nil nil nil t t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5897 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5898 "-Ca" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5899 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5900 (efs-brief-converter host-type files nil t nil nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5901 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5902 "-CFa" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5903 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5904 (efs-brief-converter host-type files t t nil nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5905 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5906 "-Cpa" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5907 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5908 (efs-brief-converter host-type files nil t nil t nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5909 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5910 "-xa" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5911 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5912 (efs-brief-converter host-type files nil t nil nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5913 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5914 "-xFa" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5915 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5916 (efs-brief-converter host-type files t t nil nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5917 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5918 "-xpa" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5919 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5920 (efs-brief-converter host-type files nil t nil t t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5921 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5922 "-CA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5923 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5924 (efs-brief-converter host-type files nil nil t nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5925 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5926 "-CFA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5927 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5928 (efs-brief-converter host-type files t nil t nil nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5929 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5930 "-CpA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5931 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5932 (efs-brief-converter host-type files nil nil t t nil t regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5933 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5934 "-xA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5935 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5936 (efs-brief-converter host-type files nil nil t nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5937 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5938 "-xFA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5939 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5940 (efs-brief-converter host-type files t nil t nil t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5941 (efs-add-ls-converter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5942 "-xpA" t (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5943 (lambda (host-type files &optional regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5944 (efs-brief-converter host-type files nil nil t t t nil regexp))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5945
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5946 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5947 ;;;; Directory Listing Parsers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5948 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5949
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5950 (defconst efs-unix:dl-listing-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5951 "^[^ \n\t]+\n? +\\([0-9]+\\|-\\|=\\) ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5952
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5953 ;; Note to progammers:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5954 ;; Below are a series of macros and functions used for parsing unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5955 ;; file listings. They are intended only to be used together, so be careful
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5956 ;; about using them out of context.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5957
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5958 (defmacro efs-ls-parse-file-line ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5959 ;; Extract the filename, size, and permission string from the current
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5960 ;; line of a dired-like listing. Assumes that the point is at
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5961 ;; the beginning of the line, leaves it just before the size entry.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5962 ;; Returns a list (name size perm-string nlinks owner).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5963 ;; If there is no file on the line, returns nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5964 (` (let ((eol (save-excursion (end-of-line) (point)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5965 name size modes nlinks owner)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5966 (skip-chars-forward " 0-9" eol)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5967 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5968 (looking-at efs-modes-links-owner-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5969 (setq modes (buffer-substring (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5970 (match-end 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5971 nlinks (string-to-int (buffer-substring (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5972 (match-end 2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5973 owner (buffer-substring (match-beginning 3) (match-end 3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5974 (re-search-forward efs-month-and-time-regexp eol t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5975 (setq name (buffer-substring (point) eol)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5976 size (string-to-int (buffer-substring (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5977 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5978 (list name size modes nlinks owner)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5979
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5980 (defun efs-relist-symlink (host user symlink path switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5981 ;; Does a re-list of a single symlink in efs-data-buffer-name-2,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5982 ;; HOST = remote host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5983 ;; USER = remote username
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5984 ;; SYMLINK = symbolic link name as a remote fullpath
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5985 ;; PATH = efs full path syntax for the dir. being listed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5986 ;; SWITCHES = ls switches to use for the re-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5987 ;; Returns (symlink-name symlink-target), as given by the listing. Returns
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5988 ;; nil if the listing fails.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5989 ;; Does NOT correct for any symlink marking.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5990 (let* ((temp (efs-make-tmp-name host nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5991 (temp-file (car temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5992 (default-major-mode 'fundamental-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5993 spot)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5994 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5995 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5996 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5997 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5998 (car
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
5999 (efs-send-cmd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6000 (list 'dir symlink (cdr temp) switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6001 (format "Listing %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6002 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6003 (efs-replace-path-component
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6004 path symlink))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6005 ;; Put the old message back.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6006 (if (and efs-verbose
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6007 (not (and (boundp 'dired-in-query) dired-in-query)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6008 (message "Listing %s..."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6009 (efs-relativize-filename path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6010 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6011 (if (efs-ftp-path temp-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6012 (efs-add-file-entry (efs-host-type efs-gateway-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6013 temp-file nil nil nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6014 (set-buffer (get-buffer-create efs-data-buffer-name-2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6015 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6016 (if (or (file-readable-p temp-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6017 (sleep-for efs-retry-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6018 (file-readable-p temp-file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6019 (let (efs-verbose)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6020 (insert-file-contents temp-file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6021 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6022 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6023 "list data file %s not readable" temp-file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6024 (skip-chars-forward " 0-9")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6025 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6026 (eq (following-char) ?l)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6027 (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6028 (setq spot (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6029 (re-search-forward " -> " nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6030 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6031 (end-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6032 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6033 ;; We might get the full path in the listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6034 (file-name-nondirectory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6035 (buffer-substring spot (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6036 (buffer-substring (match-end 0) (point)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6037 (efs-del-tmp-name temp-file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6038
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6039 (defun efs-ls-sysV-p (host user dir linkname path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6040 ;; Returns t if the symlink is listed in sysV style. i.e. The
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6041 ;; symlink name is marked with an @.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6042 ;; HOST = remote host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6043 ;; USER = remote user name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6044 ;; DIR = directory being listed as a remote full path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6045 ;; LINKNAME = relative name of symbolic link as derived from an ls -..F...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6046 ;; this is assumed to end with an @
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6047 ;; PATH = efs full path synatx for the directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6048 (let ((link (car (efs-relist-symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6049 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6050 (concat dir (substring linkname 0 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6051 path "-lFd" ))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6052 (and link (string-equal link linkname))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6053
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6054 (defun efs-ls-next-p (host user dir linkname target path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6055 ;; Returns t is the symlink is marked in the NeXT style.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6056 ;; i.e. The symlink destination is marked with an @.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6057 ;; This assumes that the host-type has already been identified
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6058 ;; as NOT sysV-unix, and that target ends in an "@".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6059 ;; HOST = remote host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6060 ;; USER = remote user name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6061 ;; DIR = remote directory being listed, as a remore full path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6062 ;; LINKNAME = relative name of symbolic link
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6063 ;; Since we've eliminated sysV, it won't be marked with an @
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6064 ;; TARGET = target of symbolic link, as derived from an ls -..F..
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6065 ;; PATH = directory being listed in full efs path syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6066 (let ((no-F-target (nth 1 (efs-relist-symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6067 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6068 (concat dir linkname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6069 path "-ld"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6070 (and no-F-target
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6071 (string-equal (concat no-F-target "@") target))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6072
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6073 ;; This deals with the F switch. Should also do something about
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6074 ;; unquoting names obtained with the SysV b switch and the GNU Q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6075 ;; switch. See Sebastian's dired-get-filename.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6076
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6077 (defun efs-ls-parser (host-type host user dir path switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6078 ;; Meant to be called by efs-parse-listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6079 ;; Assumes that point is at the beginning of the first file line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6080 ;; Assumes that SWITCHES has already been bound to nil for a dumb host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6081 ;; HOST-TYPE is the remote host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6082 ;; HOST is the remote host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6083 ;; USER is the remote user name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6084 ;; DIR is the remote directory as a full path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6085 ;; PATH is the directory in full efs syntax, and directory syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6086 ;; SWITCHES is the ls listing switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6087 (let ((tbl (efs-make-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6088 (used-F (and switches (string-match "F" switches)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6089 (old-tbl (efs-get-files-hashtable-entry path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6090 file-type symlink directory file size modes nlinks owner)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6091 (while (setq file (efs-ls-parse-file-line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6092 (setq size (nth 1 file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6093 modes (nth 2 file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6094 nlinks (nth 3 file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6095 owner (nth 4 file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6096 file (car file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6097 file-type (string-to-char modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6098 directory (eq file-type ?d))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6099 (if (eq file-type ?l)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6100 (if (string-match " -> " file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6101 (setq symlink (substring file (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6102 file (substring file 0 (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6103 ;; Shouldn't happen
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6104 (setq symlink ""))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6105 (setq symlink nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6106 (if used-F
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6107 ;; The F-switch jungle
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6108 (let ((socket (eq file-type ?s))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6109 (fifo (eq file-type ?p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6110 (executable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6111 (and (not symlink) ; x bits don't mean a thing for symlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6112 (or (memq (elt modes 3) '(?x ?s ?t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6113 (memq (elt modes 6) '(?x ?s ?t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6114 (memq (elt modes 9) '(?x ?s ?t))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6115 ;; Deal with marking of directories, executables, and sockets.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6116 (if (or (and executable (string-match "*$" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6117 (and socket (string-match "=$" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6118 (and fifo (string-match "|$" file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6119 (setq file (substring file 0 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6120 ;; Do the symlink dance.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6121 (if symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6122 (let ((fat-p (string-match "@$" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6123 (sat-p (string-match "@$" symlink)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6124 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6125 ;; Those that mark the file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6126 ((and (memq host-type '(sysV-unix apollo-unix)) fat-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6127 (setq file (substring file 0 -1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6128 ;; Those that mark nothing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6129 ((memq host-type '(bsd-unix dumb-unix)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6130 ;; Those that mark the target
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6131 ((and (eq host-type 'next-unix) sat-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6132 (setq symlink (substring symlink 0 -1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6133 ;; We don't know
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6134 ((eq host-type 'unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6135 (if fat-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6136 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6137 ((efs-ls-sysV-p host user dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6138 file path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6139 (setq host-type 'sysV-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6140 file (substring file 0 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6141 (efs-add-host 'sysV-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6142 (efs-add-listing-type 'sysV-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6143 ((and sat-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6144 (efs-ls-next-p host user dir file symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6145 path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6146 (setq host-type 'next-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6147 symlink (substring symlink 0 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6148 (efs-add-host 'next-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6149 (efs-add-listing-type 'next-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6150 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6151 (setq host-type 'bsd-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6152 (efs-add-host 'bsd-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6153 (efs-add-listing-type 'bsd-unix host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6154 (if (and sat-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6155 (efs-ls-next-p host user dir file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6156 symlink path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6157 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6158 (setq host-type 'next-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6159 symlink (substring symlink 0 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6160 (efs-add-host 'next-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6161 (efs-add-listing-type 'next-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6162 (setq host-type 'bsd-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6163 (efs-add-host 'bsd-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6164 (efs-add-listing-type 'bsd-unix host user)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6165 ;; Look out for marking of symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6166 ;; If we really wanted to, at this point we
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6167 ;; could distinguish aix from hp-ux, ultrix, irix and a/ux,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6168 ;; allowing us to skip the re-list in the future, for the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6169 ;; later 4 host types. Another version...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6170 (if (string-match "[=|*]$" symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6171 (let ((relist (efs-relist-symlink
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6172 host user (concat dir file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6173 path "-dl")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6174 (if relist (setq symlink (nth 1 relist))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6175 ;; Strip / off the end unconditionally. It's not a valid file character
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6176 ;; anyway.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6177 (if (string-match "/$" file) (setq file (substring file 0 -1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6178 (let ((mdtm (and old-tbl (nth 5 (efs-get-hash-entry file old-tbl)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6179 (if mdtm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6180 (efs-put-hash-entry file (list (or symlink directory) size owner
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6181 modes nlinks mdtm) tbl)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6182 (efs-put-hash-entry file (list (or symlink directory) size owner
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6183 modes nlinks) tbl)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6184 (forward-line 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6185 (efs-put-hash-entry "." '(t) tbl)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6186 (efs-put-hash-entry ".." '(t) tbl)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6187 tbl))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6188
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6189 (efs-defun efs-parse-listing nil (host user dir path &optional switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6190 ;; Parse the a listing which is assumed to be from some type of unix host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6191 ;; Note that efs-key will be bound to the actual host type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6192 ;; HOST = remote host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6193 ;; USER = remote user name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6194 ;; DIR = directory as a remote full path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6195 ;; PATH = directory in full efs path syntax
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6196 ;; SWITCHES = ls switches used for the listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6197 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6198 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6199 ;; look for total line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6200 ((looking-at "^total [0-9]+$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6201 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6202 ;; Beware of machines that put a blank line after the totals line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6203 (skip-chars-forward " \t\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6204 (efs-ls-parser efs-key host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6205 ;; look for errors
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6206 ((looking-at "[^\n]+\\( not found\\|: Not a directory\\)\n\\'")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6207 ;; It's an ls error message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6208 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6209 ((eobp) ; i.e. zerop buffer-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6210 nil) ; assume an ls error message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6211 ;; look for listings without total lines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6212 ((re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6213 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6214 (efs-ls-parser efs-key host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6215 (t nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6216
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6217 (efs-defun efs-parse-listing unix:unknown
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6218 (host user dir path &optional switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6219 ;; Parse the a listing which is assumed to be from some type of unix host,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6220 ;; possibly one doing a dl listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6221 ;; HOST = remote host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6222 ;; USER = remote user name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6223 ;; DIR = directory as a remote full path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6224 ;; PATH = directory in full efs path syntax
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6225 ;; SWITCHES = ls switches used for the listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6226 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6227 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6228 ;; look for total line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6229 ((looking-at "^total [0-9]+$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6230 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6231 ;; Beware of machines that put a blank line after the totals line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6232 (skip-chars-forward " \t\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6233 ;; This will make the listing-type track the host-type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6234 (efs-add-listing-type nil host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6235 (efs-ls-parser 'unix host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6236 ;; look for errors
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6237 ((looking-at "[^\n]+\\( not found\\|: Not a directory\\)\n\\'")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6238 ;; It's an ls error message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6239 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6240 ((eobp) ; i.e. zerop buffer-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6241 nil) ; assume an ls error message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6242 ;; look for listings without total lines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6243 ((and (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6244 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6245 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6246 (looking-at efs-modes-links-owner-regexp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6247 (efs-add-listing-type nil host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6248 (efs-ls-parser 'unix host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6249 ;; look for dumb listings
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6250 ((re-search-forward
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6251 (concat (regexp-quote switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6252 " not found\\|\\(^ls: +illegal option -- \\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6253 (save-excursion (end-of-line) (point)) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6254 (if (eq (efs-host-type host) 'apollo-unix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6255 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6256 (efs-add-host 'dumb-apollo-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6257 (efs-add-listing-type 'dumb-apollo-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6258 (efs-add-host 'dumb-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6259 (efs-add-listing-type 'dumb-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6260 (if (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6261 ;; Need to try to list again.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6262 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6263 (efs-ls
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6264 path nil (format "Relisting %s" (efs-relativize-filename path)) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6265 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6266 (efs-parse-listing nil host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6267 (if (re-search-forward "^total [0-9]+$" nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6268 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6269 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6270 (delete-region (point-min) (point))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6271 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6272 (efs-ls-parser 'dumb-unix host user dir path switches)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6273 ;; Look for dl listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6274 ((re-search-forward efs-unix:dl-listing-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6275 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6276 (efs-add-listing-type 'unix:dl host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6277 (efs-parse-listing 'unix:dl host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6278 ;; don't know, return nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6279 (t nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6280
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6281 (defun efs-ls-parse-1-liner (filename buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6282 ;; Parse a 1-line listing for FILENAME in BUFFER, and update
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6283 ;; the cached info for FILENAME.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6284 ;; Optional SYMLINK arg gives the expected target of a symlink.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6285 ;; Since one-line listings are usually used to update info for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6286 ;; newly created files, we usually know what sort of a file to expect.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6287 ;; Actually trying to parse out the symlink target could be impossible
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6288 ;; for some types of switches.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6289 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6290 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6291 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6292 (skip-chars-forward " 0-9")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6293 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6294 (let (modes nlinks owner size)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6295 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6296 (looking-at efs-modes-links-owner-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6297 (setq modes (buffer-substring (match-beginning 1) (match-end 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6298 nlinks (string-to-int (buffer-substring (match-beginning 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6299 (match-end 2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6300 owner (buffer-substring (match-beginning 3) (match-end 3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6301 (re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6302 (setq size (string-to-int (buffer-substring (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6303 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6304 (let* ((filename (directory-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6305 (files (efs-get-files-hashtable-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6306 (file-name-directory filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6307 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6308 (let* ((key (efs-get-file-part filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6309 (ignore-case (memq (efs-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6310 (car (efs-ftp-path filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6311 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6312 (ent (efs-get-hash-entry key files ignore-case))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6313 (mdtm (nth 5 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6314 type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6315 (if (= (string-to-char modes) ?l)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6316 (setq type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6317 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6318 ((stringp symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6319 symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6320 ((stringp (car ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6321 (car ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6322 (t ; something weird happened.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6323 "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6324 (if (= (string-to-char modes) ?d)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6325 (setq type t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6326 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6327 key (list type size owner modes nlinks mdtm)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6328 files ignore-case)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6329
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6330 (efs-defun efs-update-file-info nil (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6331 "For FILE, update cache information from a single file listing in BUFFER."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6332 ;; By default, this does nothing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6333 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6334
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6335 (efs-defun efs-update-file-info unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6336 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6337 (efs-defun efs-update-file-info sysV-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6338 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6339 (efs-defun efs-update-file-info bsd-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6340 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6341 (efs-defun efs-update-file-info next-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6342 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6343 (efs-defun efs-update-file-info apollo-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6344 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6345 (efs-defun efs-update-file-info dumb-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6346 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6347 (efs-defun efs-update-file-info dumb-apollo-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6348 (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6349 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6350 (efs-defun efs-update-file-info super-dumb-unix (file buffer &optional symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6351 (efs-ls-parse-1-liner file buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6352
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6353 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6354 ;;;; The 'unknown listing parser. This does some host-type guessing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6355 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6356
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6357 ;;; Regexps for host and listing type guessing from the listing syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6358
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6359 (defconst efs-ka9q-listing-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6360 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6361 "^\\([0-9,.]+\\|No\\) files\\. [0-9,.]+ bytes free\\. "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6362 "Disk size [0-9,]+ bytes\\.$"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6363 ;; This version of the regexp is really for hosts which allow some switches,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6364 ;; but not ours. Rather than determine which switches we could be using
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6365 ;; we just assume that it's dumb.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6366 (defconst efs-dumb-unix-listing-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6367 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6368 "^[Uu]sage: +ls +-[a-zA-Z0-9]+[ \n]\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6369 ;; Unitree server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6370 "^Error getting stats for \"-[a-zA-Z0-9]+\""))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6371
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6372 (defconst efs-dos-distinct-date-and-time-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6373 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6374 " \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6375 "\\|Nov\\|Dec\\) [ 0-3][0-9],[12][90][0-9][0-9] "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6376 "[ 12][0-9]:[0-5][0-9] "))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6377 ;; Regexp to match the output from the hellsoft ftp server to an
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6378 ;; ls -al. Unfortunately, this looks a lot like some unix ls error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6379 ;; messages.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6380 (defconst efs-hell-listing-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6381 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6382 "ls: file or directory not found\n\\'\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6383 "[-d]\\[[-A-Z][-A-Z][-A-Z][-A-Z][-A-Z][-A-Z][-A-Z]\\]"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6384
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6385 (efs-defun efs-parse-listing unknown
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6386 (host user dir path &optional switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6387 "Parse the current buffer which is assumed to contain a dir listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6388 Return a hashtable as the result. If the listing is not really a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6389 directory listing, then return nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6390
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6391 HOST is the remote host's name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6392 USER is the remote user name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6393 DIR is the directory as a full remote path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6394 PATH is the directory in full efs path synatx.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6395 SWITCHES are the switches passed to ls. If SWITCHES is nil, then a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6396 dumb \(with dir\) listing has been done."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6397 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6398 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6399
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6400 ;; look for total line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6401 ((looking-at "^total [0-9]+$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6402 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6403 (forward-line 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6404 ;; Beware of machines that put a blank line after the totals line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6405 (skip-chars-forward " \t\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6406 (efs-ls-parser 'unix host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6407
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6408 ;; Look for hellsoft. Need to do this before looking
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6409 ;; for ls errors, since the hellsoft output looks a lot like an ls error.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6410 ((looking-at efs-hell-listing-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6411 (if (null (car (efs-send-cmd host user '(quote site dos))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6412 (let* ((key (concat host "/" user "/~"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6413 (tilde (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6414 key efs-expand-dir-hashtable)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6415 (efs-add-host 'hell host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6416 ;; downcase the expansion of ~
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6417 (if (and tilde (string-match "^[^a-z]+$" tilde))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6418 (efs-put-hash-entry key (downcase tilde)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6419 efs-expand-dir-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6420 ;; Downcase dir, in case its got some upper case stuff in it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6421 (setq dir (downcase dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6422 path (efs-replace-path-component path dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6423 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6424 ;; This will force the data buffer to be re-filled
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6425 (efs-ls path nil (format "Relisting %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6426 (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6427 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6428 (efs-parse-listing 'hell host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6429 ;; Don't know, give unix a try.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6430 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6431 nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6432
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6433 ;; look for ls errors
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6434 ((looking-at "[^\n]+\\( not found\\|: Not a directory\\)\n\\'")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6435 ;; It's an ls error message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6436 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6437 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6438
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6439 ((eobp) ; i.e. (zerop (buffer-size))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6440 ;; This could be one of:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6441 ;; (1) An Ultrix ls error message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6442 ;; (2) A listing with the A switch of an empty directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6443 ;; on a machine which doesn't give a total line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6444 ;; (3) The result of an attempt at an nlist. (This would mean a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6445 ;; dumb host.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6446 ;; (4) The twilight zone.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6447 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6448 ((save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6449 (set-buffer (process-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6450 (efs-get-process host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6451 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6452 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6453 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6454 ;; The dir ftp output starts with a 200 cmd.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6455 (re-search-backward "^150 " nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6456 ;; We never do an nlist (it's a short listing).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6457 ;; If the machine thinks that we did, it's dumb.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6458 (looking-at "[^\n]+ NLST "))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6459 ;; It's dumb-unix or ka9q. Anything else?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6460 ;; This will re-fill the data buffer with a dumb listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6461 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6462 (efs-ls path nil (format "Relisting %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6463 (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6464 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6465 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6466 ;; check for dumb-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6467 ((re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6468 (efs-add-host 'dumb-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6469 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6470 (efs-parse-listing 'dumb-unix host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6471 ;; check for ka9q
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6472 ((save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6473 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6474 (forward-line -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6475 (looking-at efs-ka9q-listing-regexp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6476 (efs-add-host 'ka9q host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6477 (efs-parse-listing 'ka9q host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6478 (t ; Don't know, try unix.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6479 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6480 nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6481 ;; check for Novell Netware
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6482 ((null (car (efs-send-cmd host user '(quote site nfs))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6483 (efs-add-host 'netware host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6484 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6485 (efs-ls path nil (format "Relisting %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6486 (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6487 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6488 (efs-parse-listing 'netware host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6489 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6490 ;; Assume (1), an Ultrix error message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6491 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6492 nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6493
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6494 ;; unix without a total line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6495 ((re-search-forward efs-month-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6496 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6497 (beginning-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6498 (efs-ls-parser 'unix host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6499
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6500 ;; Now we look for host-types, or listing-types which are auto-rec
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6501 ;; by the listing parser, because it's not possible to pick them out
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6502 ;; from a pwd.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6503
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6504 ;; check for dumb-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6505 ;; (Guessing of dumb-unix hosts which return an ftp error message is
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6506 ;; done in efs-ls.)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6507 ((re-search-forward efs-dumb-unix-listing-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6508 (efs-add-host 'dumb-unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6509 ;; This will force the data buffer to be re-filled
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6510 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6511 (efs-ls path nil (format "Relisting %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6512 (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6513 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6514 (efs-parse-listing 'dumb-unix host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6515
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6516 ;; check for Distinct's DOS ftp server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6517 ((re-search-forward efs-dos-distinct-date-and-time-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6518 (efs-add-host 'dos-distinct host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6519 (efs-parse-listing 'dos-distinct host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6520
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6521 ;; check for KA9Q pseudo-unix (LINUX?)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6522 ((save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6523 (goto-char (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6524 (forward-line -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6525 (looking-at efs-ka9q-listing-regexp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6526 (efs-add-host 'ka9q host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6527 ;; This will re-fill the data buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6528 ;; Need to do this because ka9q is a dumb host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6529 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6530 (efs-ls path nil (format "Relisting %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6531 (efs-relativize-filename path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6532 t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6533 (efs-parse-listing 'ka9q host user dir path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6534
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6535 ;; Check for a unix descriptive (dl) listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6536 ;; Do this last, because it's hard to guess.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6537 ((re-search-forward efs-unix:dl-listing-regexp nil t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6538 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6539 (efs-add-listing-type 'unix:dl host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6540 (efs-parse-listing 'unix:dl host user dir path switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6541
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6542 ;; Don't know what's going on. Return nil, and assume unix.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6543 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6544 (efs-add-host 'unix host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6545 nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6546
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6547 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6548 ;;;; Directory information hashtable.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6549 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6550
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6551 (efs-defun efs-really-file-p nil (file ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6552 ;; efs-files-hashtable sometimes contains fictitious entries, when
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6553 ;; some OS's allow a file to be accessed by another name. For example,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6554 ;; in VMS the highest version of a file may be accessed by omitting the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6555 ;; the file version number. This function should return t if the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6556 ;; filename FILE is really a file. ENT is the hash entry of the file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6557 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6558
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6559 (efs-defun efs-add-file-entry nil (path type size owner
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6560 &optional modes nlinks mdtm)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6561 ;; Add a new file entry for PATH
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6562 ;; TYPE is nil for a plain file, t for a directory, and a string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6563 ;; (the target of the link) for a symlink.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6564 ;; SIZE is the size of the file in bytes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6565 ;; OWNER is the owner of the file, as a string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6566 ;; MODES is the file modes, as a string. In Unix, this will be 10 cars.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6567 ;; NLINKS is the number of links for the file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6568 ;; MDTM is the last modtime obtained for the file. This is for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6569 ;; short-term cache only, as emacs often has sequences of functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6570 ;; doing modtime lookup. If you really want to be sure of the modtime,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6571 ;; use efs-get-file-mdtm, which asks the remote server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6572
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6573 (and (eq type t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6574 (setq path (directory-file-name path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6575 (let ((files (efs-get-files-hashtable-entry (file-name-directory path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6576 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6577 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6578 (efs-get-file-part path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6579 (cond (mdtm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6580 (list type size owner modes nlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6581 mdtm))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6582 (nlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6583 (list type size owner modes nlinks))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6584 (modes (list type size owner modes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6585 (t (list type size owner)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6586 files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6587 (memq efs-key efs-case-insensitive-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6588 (efs-del-from-ls-cache path t nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6589
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6590 (efs-defun efs-delete-file-entry nil (path &optional dir-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6591 "Delete the file entry for PATH, if its directory info exists."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6592 (if dir-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6593 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6594 (setq path (file-name-as-directory path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6595 (efs-del-hash-entry (efs-canonize-file-name path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6596 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6597 ;; Note that file-name-as-directory followed by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6598 ;; (substring path 0 -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6599 ;; serves to canonicalize directory file names to their unix form.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6600 ;; i.e. in VMS, FOO.DIR -> FOO/ -> FOO
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6601 ;; PATH is supposed to be s fully expanded efs-style path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6602 (setq path (substring path 0 -1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6603 (let ((files (efs-get-files-hashtable-entry (file-name-directory path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6604 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6605 (efs-del-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6606 (efs-get-file-part path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6607 files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6608 (memq (efs-host-type (car (efs-ftp-path path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6609 efs-case-insensitive-host-types))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6610 (efs-del-from-ls-cache path t nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6611 (if dir-p (efs-del-from-ls-cache path nil t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6612
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6613 (defun efs-set-files (directory files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6614 "For DIRECTORY, set or change the associated FILES hashtable."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6615 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6616 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6617 (efs-canonize-file-name (file-name-as-directory directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6618 files efs-files-hashtable)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6619
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6620 (defun efs-parsable-switches-p (switches &optional full-dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6621 ;; Returns non-nil if SWITCHES would give an ls listing suitable for parsing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6622 ;; If FULL-DIR is non-nil, the switches must be suitable for parsing a full
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6623 ;; ditectory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6624 (or (null switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6625 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6626 (and (string-match "[aA]" switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6627 ;; g is not good enough, need l or o for owner.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6628 (string-match "[lo]" switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6629 ;; L shows link target, rather than link. We need both.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6630 (not (string-match "[RfL]" switches))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6631 (not (and full-dir (string-match "d" switches)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6632
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6633 (defun efs-get-files (directory &optional no-error)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6634 "For DIRECTORY, return a hashtable of file entries.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6635 This will give an error or return nil, depending on the value of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6636 NO-ERROR, if a listing for DIRECTORY cannot be obtained."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6637 (let ((directory (file-name-as-directory directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6638 (or (efs-get-files-hashtable-entry directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6639 (and (efs-ls directory (efs-ls-guess-switches) t 'parse no-error)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6640 (efs-get-files-hashtable-entry directory)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6641
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6642 (efs-defun efs-allow-child-lookup nil (host user dir file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6643 ;; Returns non-nil if in directory DIR, FILE could possibly be a subdir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6644 ;; according to its file-name syntax, and therefore a child listing should
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6645 ;; be attempted. Note that DIR is in directory syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6646 ;; i.e. /foo/bar/, not /foo/bar.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6647 ;; Deal with dired. Anything else?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6648 (not (and (boundp 'dired-local-variables-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6649 (stringp dired-local-variables-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6650 (string-equal dired-local-variables-file file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6651
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6652 (defmacro efs-ancestral-check (host-type path ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6653 ;; Checks to see if something in a path's ancient parentage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6654 ;; would make it impossible for the path to exist in the directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6655 ;; tree. In this case it returns nil. Otherwise returns t (there
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6656 ;; is essentially no information returned in this case, the file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6657 ;; may exist or not).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6658 ;; This macro should make working with RCS more efficient.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6659 ;; It also helps with FTP servers that go into fits if we ask to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6660 ;; list a non-existent dir.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6661 ;; Yes, I know that the function mapped over the hashtable can
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6662 ;; be written more cleanly with a concat, but this is faster.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6663 ;; concat's cause a lot of consing. So do regexp-quote's, but we can't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6664 ;; avoid it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6665 ;; Probably doesn't make much sense for this to be an efs-defun, since
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6666 ;; the host-type dependence is very mild.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6667 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6668 (let ((path (, path)) ; expand once
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6669 (ignore-case (, ignore-case))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6670 str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6671 ;; eliminate flat file systems -- should have a constant for this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6672 (or (memq (, host-type) '(mts cms mvs cms-knet))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6673 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6674 (catch 'foo
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6675 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6676 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6677 (lambda (key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6678 (and (eq (string-match (regexp-quote key) path) 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6679 (setq str (substring path (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6680 (string-match "^[^/]+" str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6681 (not (efs-hash-entry-exists-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6682 (substring str 0 (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6683 val ignore-case))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6684 (throw 'foo nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6685 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6686 t))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6687
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6688 (defun efs-file-entry-p (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6689 ;; Return whether there is a file entry for PATH.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6690 ;; Under no circumstances does this cause FTP activity.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6691 (let* ((path (directory-file-name (efs-canonize-file-name path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6692 (dir (file-name-directory path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6693 (file (efs-get-file-part path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6694 (tbl (efs-get-files-hashtable-entry dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6695 (and tbl (efs-hash-entry-exists-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6696 file tbl
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6697 (memq (efs-host-type (car (efs-ftp-path dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6698 efs-case-insensitive-host-types)) t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6699
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6700 (defun efs-get-file-entry (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6701 "Return the given file entry for PATH.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6702 This is a list of the form \(type size owner modes nlinks modtm\),
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6703 where type is nil for a normal file, t for a directory, and a string for a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6704 symlink, size is the size of the file in bytes, if known, and modes are
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6705 the permission modes of the file as a string. modtm is short-term the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6706 cache of the file modtime. It is not used by `verify-visited-file-modtime'.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6707 If the file isn't in the hashtable, this returns nil."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6708 (let* ((path (directory-file-name (efs-canonize-file-name path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6709 (dir (file-name-directory path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6710 (file (efs-get-file-part path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6711 (parsed (efs-ftp-path dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6712 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6713 (host-type (efs-host-type host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6714 (ent (efs-get-files-hashtable-entry dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6715 (ignore-case (memq host-type efs-case-insensitive-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6716 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6717 (efs-get-hash-entry file ent ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6718 (let ((user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6719 (r-dir (nth 2 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6720 (and (efs-ancestral-check host-type path ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6721 (or (and efs-allow-child-lookup
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6722 (efs-allow-child-lookup host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6723 host user r-dir file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6724 (setq ent (efs-get-files path t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6725 (efs-get-hash-entry "." ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6726 ;; i.e. it's a directory by child lookup
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6727 (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6728 file (efs-get-files dir) ignore-case)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6729
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6730 (defun efs-wipe-file-entries (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6731 "Remove cache data for all files on HOST and USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6732 This replaces the file entry information hashtable with one that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6733 doesn't have any entries for the given HOST, USER pair."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6734 (let ((new-tbl (efs-make-hashtable (length efs-files-hashtable)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6735 (host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6736 (case-fold (memq (efs-host-type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6737 efs-case-insensitive-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6738 (if case-fold (setq user (downcase user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6739 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6740 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6741 (lambda (key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6742 (let ((parsed (efs-ftp-path key)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6743 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6744 (let ((h (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6745 (u (nth 1 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6746 (or (and (string-equal host (downcase h))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6747 (string-equal user (if case-fold (downcase u) u)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6748 (efs-put-hash-entry key val new-tbl)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6749 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6750 (setq efs-files-hashtable new-tbl)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6751
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6752
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6753 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6754 ;;;; >8
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6755 ;;;; Redefinitions of standard GNU Emacs functions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6756 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6757
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6758 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6759 ;;;; expand-file-name and friends...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6760 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6761
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6762 ;; New filename expansion code for efs.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6763 ;; The overall structure is based around the following internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6764 ;; functions and macros. Since these are internal, they do NOT
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6765 ;; call efs-save-match-data. This is done by their calling
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6766 ;; function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6767 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6768 ;; efs-expand-tilde
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6769 ;; - expands all ~ constructs, both local and remote.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6770 ;; efs-short-circuit-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6771 ;; - short-circuits //'s and /~'s, for both local and remote paths.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6772 ;; efs-de-dot-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6773 ;; - canonizes /../ and /./'s in both local and remote paths.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6774 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6775 ;; The following two functions overload existing emacs functions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6776 ;; They are the entry points to this filename expansion code, and as such
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6777 ;; call efs-save-match-data.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6778 ;;
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6779 ;; efs-expand-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6780 ;; efs-substitute-in-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6781
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6782 ;;; utility macros
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6783
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6784 (defmacro efs-short-circuit-file-name (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6785 ;; Short-circuits //'s and /~'s in filenames.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6786 ;; Returns a list consisting of the local path,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6787 ;; host-type, host, user. For local hosts,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6788 ;; host-type, host, and user are all nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6789 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6790 (let ((start 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6791 (string (, filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6792 backskip regexp lbackskip
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6793 lregexp parsed host-type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6794
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6795 (if efs-local-apollo-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6796 (setq lregexp ".//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6797 lbackskip 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6798 (setq lregexp "//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6799 lbackskip 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6800
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6801 ;; Short circuit /user@mach: roots. It is important to do this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6802 ;; now to avoid unnecessary ftp connections.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6803
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6804 (while (string-match efs-path-root-short-circuit-regexp string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6805 (setq start (1+ (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6806 (or (zerop start) (setq string (substring string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6807 start 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6808
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6809 ;; identify remote root
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6810
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6811 (if (setq parsed (efs-ftp-path-macro string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6812 (if (memq (setq string (nth 2 parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6813 host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6814 (efs-host-type (setq host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6815 (setq user (nth 1 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6816 '(apollo-unix dumb-apollo-unix))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6817 (setq regexp ".//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6818 backskip 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6819 (setq regexp "//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6820 backskip 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6821 (setq regexp lregexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6822 backskip lbackskip))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6823
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6824 ;; Now short-circuit in an apollo and efs sensitive way.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6825
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6826 (while (cond ((string-match regexp string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6827 (setq start (- (match-end 0) backskip)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6828 ((string-match "/~" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6829 (setq start (1- (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6830
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6831 (and host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6832 (null efs-short-circuit-to-remote-root)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6833 (setq host-type nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6834 regexp lregexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6835 backskip lbackskip)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6836 (or (zerop start) (setq string (substring string start)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6837 (list string host-type (and host-type host) (and host-type user)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6838
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6839 (defmacro efs-expand-tilde (tilde host-type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6840 ;; Expands a TILDE (~ or ~sandy type construction)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6841 ;; Takes as an arg a filename (not directory name!)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6842 ;; and returns a filename. HOST-TYPE is the type of remote host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6843 ;; nil is the type of the local host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6844 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6845 (if (, host-type) ; nil host-type is the local machine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6846 (let* ((host (downcase (, host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6847 (host-type (, host-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6848 (ignore-case (memq host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6849 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6850 (tilde (, tilde))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6851 (user (, user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6852 (key (concat host "/" user "/" tilde))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6853 (res (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6854 key efs-expand-dir-hashtable ignore-case)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6855 (or res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6856 ;; for real accounts on unix systems, use the get trick
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6857 (and (not (efs-anonymous-p user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6858 (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6859 (let ((line (nth 1 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6860 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6861 (list 'get tilde "/dev/null")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6862 (format "expanding %s" tilde)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6863 (setq res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6864 (and (string-match efs-expand-dir-msgs line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6865 (substring line
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6866 (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6867 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6868 (if res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6869 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6870 (setq res (efs-internal-directory-file-name res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6871 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6872 key res efs-expand-dir-hashtable ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6873 res))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6874 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6875 (setq res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6876 (if (string-equal tilde "~")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6877 (car (efs-send-pwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6878 host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6879 (let* ((home-key (concat host "/" user "/~"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6880 (home (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6881 home-key efs-expand-dir-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6882 ignore-case))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6883 pwd-result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6884 (if home
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6885 (setq home
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6886 (efs-fix-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6887 host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6888 (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6889 host-type home)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6890 (if (setq home
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6891 (car
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6892 (setq pwd-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6893 (efs-send-pwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6894 host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6895 host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6896 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6897 home-key
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6898 (efs-internal-directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6899 (efs-fix-path host-type home 'reverse))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6900 efs-expand-dir-hashtable ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6901 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6902 (concat "PWD failed: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6903 (cdr pwd-result)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6904 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6905 (and (efs-raw-send-cd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6906 (efs-fix-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6907 host-type tilde) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6908 (car
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6909 (efs-send-pwd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6910 host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6911 (efs-raw-send-cd host user home)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6912 (if res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6913 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6914 (setq res (efs-internal-directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6915 (efs-fix-path host-type res 'reverse)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6916 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6917 key res efs-expand-dir-hashtable ignore-case)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6918 res)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6919 (if (string-equal tilde "~")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6920 (error "Cannot get home directory on %s" host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6921 (error "User %s is not known on %s" (substring tilde 1) host))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6922 ;; local machine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6923 (efs-real-expand-file-name (, tilde)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6924
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6925 (defmacro efs-de-dot-file-name (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6926 ;; Takes a string as arguments, and removes /../'s and /./'s.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6927 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6928 (let ((string (, string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6929 (start 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6930 new make-dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6931 ;; to make the regexp's simpler, canonicalize to directory name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6932 (if (setq make-dir (string-match "/\\.\\.?$" string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6933 (setq string (concat string "/")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6934 (while (string-match "/\\./" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6935 (setq new (concat new
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6936 (substring string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6937 start (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6938 start (1- (match-end 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6939
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6940 (if new (setq string (concat new (substring string start))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6941
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6942 (while (string-match "/[^/]+/\\.\\./" string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6943 ;; Is there a way to avoid all this concating and copying?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6944 (setq string (concat (substring string 0 (1+ (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6945 (substring string (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6946
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6947 ;; Do /../ and //../ special cases. They should expand to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6948 ;; / and //, respectively.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6949 (if (string-match "^\\(/+\\)\\.\\./" string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6950 (setq string (concat (substring string 0 (match-end 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6951 (substring string (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6952
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6953 (if (and make-dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6954 (not (string-match "^/+$" string)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6955 (substring string 0 -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6956 string))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6957
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6958 (defun efs-substitute-in-file-name (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6959 "Documented as original."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6960 ;; Because of the complicated interaction between short-circuiting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6961 ;; and environment variable substitution, this can't call the macro
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6962 ;; efs-short-circuit-file-name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6963 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6964 (let ((start 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6965 var new root backskip regexp lbackskip
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6966 lregexp parsed fudge-host-type rstart error)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6967
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6968 (if efs-local-apollo-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6969 (setq lregexp ".//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6970 lbackskip 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6971 (setq lregexp "//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6972 lbackskip 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6973
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6974 ;; Subst. existing env variables
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6975 (while (string-match "\\$" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6976 (setq new (concat new (substring string start (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6977 start (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6978 (cond ((eq (string-match "\\$" string start) start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6979 (setq start (1+ start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6980 new (concat new "$$")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6981 ((eq (string-match "{" string start) start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6982 (if (and (string-match "}" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6983 (setq var (getenv
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6984 (substring string (1+ start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6985 (1- (match-end 0))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6986 (setq start (match-end 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6987 new (concat new var))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6988 (setq new (concat new "$"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6989 ((eq (string-match "[a-zA-Z0-9]+" string start) start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6990 (if (setq var (getenv
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6991 (substring string start (match-end 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6992 (setq start (match-end 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6993 new (concat new var))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6994 (setq new (concat new "$"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6995 ((setq new (concat new "$")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6996 (if new (setq string (concat new (substring string start))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6997 start 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6998
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
6999 ;; Short circuit /user@mach: roots. It is important to do this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7000 ;; now to avoid unnecessary ftp connections.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7001
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7002 (while (string-match efs-path-root-short-circuit-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7003 string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7004 (setq start (1+ (match-beginning 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7005 (or (zerop start) (setq string (substring string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7006 start 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7007
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7008 ;; Look for invalid environment variables in the root. If one is found,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7009 ;; we set the host-type to 'unix. Since we can't login in to determine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7010 ;; it. There is a good chance that we will bomb later with an error,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7011 ;; but the day may yet be saved if the root is short-circuited off.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7012
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7013 (if (string-match efs-path-root-regexp string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7014 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7015 (setq root (substring string 0 (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7016 start (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7017 (if (string-match "[^$]\\(\\$\\$\\)*\\$[^$]" root)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7018 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7019 (setq rstart (1- (match-end 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7020 fudge-host-type t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7021 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7022 ((eq (elt root rstart) ?{)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7023 (setq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7024 error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7025 (if (string-match "}" root rstart)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7026 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7027 "Subsituting non-existent environment variable "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7028 (substring root (1+ rstart) (match-beginning 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7029 "Missing \"}\" in environment-variable substitution")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7030 ((eq (string-match "[A-Za-z0-9]+" root rstart) rstart)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7031 (setq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7032 error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7033 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7034 "Subsituting non-existent environment variable "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7035 (substring root rstart (match-beginning 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7036 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7037 (setq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7038 error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7039 "Bad format environment-variable substitution")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7040 (setq root (efs-unquote-dollars root)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7041 parsed (efs-ftp-path root))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7042
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7043 (if (and (not fudge-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7044 ;; This may trigger an FTP connection
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7045 (memq (efs-host-type (car parsed) (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7046 '(apollo-unix dumb-apollo-unix)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7047 (setq regexp ".//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7048 backskip 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7049 (setq regexp "//+"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7050 backskip 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7051 ;; no root, we're local
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7052 (setq regexp lregexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7053 backskip lbackskip))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7054
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7055 ;; Now short-circuit in an apollo and efs sensitive way.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7056
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7057 (while (cond ((string-match regexp string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7058 (setq start (- (match-end 0) backskip)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7059 ((string-match "/~" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7060 (setq start (1- (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7061
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7062 (and root
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7063 (null efs-short-circuit-to-remote-root)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7064 (setq root nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7065 regexp lregexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7066 backskip lbackskip)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7067
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7068 ;; If we still have a bad root, barf.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7069 (if (and root error) (error error))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7070
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7071 ;; look for non-existent evironment variables in the path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7072
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7073 (if (string-match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7074 "\\([^$]\\|^\\)\\(\\$\\$\\)*\\$\\([^$]\\|$\\)" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7075 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7076 (setq start (match-beginning 3))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7077 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7078 ((eq (length string) start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7079 (error "Empty string is an invalid environment variable"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7080 ((eq (elt string start) ?{)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7081 (if (string-match "}" string start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7082 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7083 "Subsituting non-existent environment variable %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7084 (substring string (1+ start) (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7085 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7086 "Missing \"}\" in environment-variable substitution")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7087 ((eq (string-match "[A-Za-z0-9]+" string start) start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7088 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7089 "Subsituting non-existent environment variable %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7090 (substring string start (match-end 0))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7091 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7092 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7093 "Bad format environment-variable substitution")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7094
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7095 (if root
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7096 (concat root
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7097 (efs-unquote-dollars
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7098 (if (zerop start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7099 string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7100 (substring string start))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7101 (efs-unquote-dollars
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7102 (if (zerop start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7103 string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7104 (substring string start)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7105
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7106 (defun efs-expand-file-name (name &optional default)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7107 "Documented as original."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7108 (let (s-c-res path host user host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7109 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7110 (or (file-name-absolute-p name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7111 (setq name (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7112 (file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7113 (or default default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7114 name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7115 (setq s-c-res (efs-short-circuit-file-name name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7116 path (car s-c-res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7117 host-type (nth 1 s-c-res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7118 host (nth 2 s-c-res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7119 user (nth 3 s-c-res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7120 (cond ((string-match "^~[^/]*" path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7121 (let ((start (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7122 (setq path (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7123 (efs-expand-tilde
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7124 (substring path 0 start)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7125 host-type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7126 (substring path start)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7127 ((and host-type (not (file-name-absolute-p path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7128 ;; We expand the empty string to a directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7129 ;; This can be more efficient for filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7130 ;; completion. It's also consistent with non-unix.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7131 (let ((tilde (efs-expand-tilde
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7132 "~" host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7133 (if (string-equal tilde "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7134 (setq path (concat "/" path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7135 (setq path (concat tilde "/" path))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7136
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7137 (setq path (efs-de-dot-file-name path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7138 (if host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7139 (format efs-path-format-string user host path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7140 path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7141
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7142 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7143 ;;;; Other functions for manipulating file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7144 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7145
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7146 (defun efs-internal-file-name-extension (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7147 ;; Returns the extension for file name FN.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7148 (save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7149 (let ((file (file-name-sans-versions (file-name-nondirectory filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7150 (if (string-match "\\.[^.]*\\'" file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7151 (substring file (match-beginning 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7152 ""))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7153
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7154 (defun efs-file-name-as-directory (name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7155 ;; version of file-name-as-directory for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7156 ;; Usually just appends a / if there isn't one already.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7157 ;; For some systems, it may also remove .DIR like extensions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7158 (let* ((parsed (efs-ftp-path name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7159 (file (nth 2 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7160 (if (string-equal file "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7161 name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7162 (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7163 (efs-host-type (car parsed) (nth 1 parsed)) name))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7164
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7165 (efs-defun efs-internal-file-name-as-directory nil (name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7166 ;; By default, simply adds a trailing /, if there isn't one.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7167 ;; Note that for expanded filenames, it pays to call this rather
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7168 ;; than efs-file-name-as-directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7169 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7170 (file-name-as-directory name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7171
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7172 (defun efs-file-name-directory (name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7173 ;; file-name-directory for remote files. Takes care not to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7174 ;; turn /user@host: into /.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7175 (let ((path (nth 2 (efs-ftp-path name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7176 file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7177 (if (or (string-equal path "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7178 (and (= (string-to-char path) ?~)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7179 (not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7180 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7181 (string-match "/" path 1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7182 name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7183 (if (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7184 (not (string-match "/" path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7185 (efs-replace-path-component name "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7186 (file-name-directory name)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7187
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7188 (defun efs-file-name-nondirectory (name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7189 ;; Computes file-name-nondirectory for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7190 ;; For expanded filenames, can just call efs-internal-file-name-nondirectory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7191 (let ((file (nth 2 (efs-ftp-path name))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7192 (if (or (string-equal file "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7193 (and (= (string-to-char file) ?~)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7194 (not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7195 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7196 (string-match "/" file 1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7197 ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7198 (if (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7199 (not (string-match "/" file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7200 file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7201 (efs-internal-file-name-nondirectory name)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7202
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7203 (defun efs-internal-file-name-nondirectory (name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7204 ;; Version of file-name-nondirectory, without the efs-file-handler-function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7205 ;; Useful to call this, if we have already decomposed the filename.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7206 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7207 (file-name-nondirectory name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7208
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7209 (defun efs-directory-file-name (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7210 ;; Computes directory-file-name for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7211 ;; Needs to be careful not to turn /foo@bar:/ into /foo@bar:
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7212 (let ((parsed (efs-ftp-path dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7213 (if (string-equal "/" (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7214 dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7215 (efs-internal-directory-file-name dir))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7216
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7217 (defun efs-internal-directory-file-name (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7218 ;; Call this if you want to apply directory-file-name to the remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7219 ;; part of a efs-style path. Don't call for non-efs-style paths,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7220 ;; as this short-circuits the file-name-handler-alist completely.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7221 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7222 (directory-file-name dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7223
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7224 (efs-defun efs-remote-directory-file-name nil (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7225 "Returns the file name on the remote system of directory DIR.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7226 If the remote system is not unix, this may not be the same as the file name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7227 of the directory in efs's internal cache."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7228 (directory-file-name dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7229
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7230 (defun efs-file-name-sans-versions (filename &optional keep-backup-versions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7231 ;; Version of file-name-sans-versions for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7232 (or (file-name-absolute-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7233 (setq filename (expand-file-name filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7234 (let ((parsed (efs-ftp-path filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7235 (efs-internal-file-name-sans-versions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7236 (efs-host-type (car parsed) (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7237 filename keep-backup-versions)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7238
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7239 (efs-defun efs-internal-file-name-sans-versions nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7240 (filename &optional keep-backup-versions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7241 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7242 (file-name-sans-versions filename keep-backup-versions)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7243
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7244 (defun efs-diff-latest-backup-file (fn)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7245 ;; Version of diff latest backup file for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7246 ;; Accomodates non-unix.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7247 ;; Returns the latest backup for fn, according to the numbering
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7248 ;; of the backups. Does not check file-newer-than-file-p.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7249 (let ((parsed (efs-ftp-path fn)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7250 (efs-internal-diff-latest-backup-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7251 (efs-host-type (car parsed) (nth 1 parsed)) fn)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7252
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7253 (efs-defun efs-internal-diff-latest-backup-file nil (fn)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7254 ;; Default behaviour is the behaviour in diff.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7255 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7256 (diff-latest-backup-file fn)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7257
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7258 (defun efs-unhandled-file-name-directory (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7259 ;; Calculate a default unhandled directory for an efs buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7260 ;; This is used to compute directories in which to execute
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7261 ;; processes. This is relevant to V19 only. Doesn't do any harm for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7262 ;; older versions though. It would be nice if this wasn't such a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7263 ;; kludge.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7264 (file-name-directory efs-tmp-name-template))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7265
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7266 (defun efs-file-truename (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7267 ;; Calculates a remote file's truename, if this isn't inhibited.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7268 (let ((filename (expand-file-name filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7269 (if (and efs-compute-remote-buffer-file-truename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7270 (memq (efs-host-type (car (efs-ftp-path filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7271 efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7272 (efs-internal-file-truename filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7273 filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7274
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7275 (defun efs-internal-file-truename (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7276 ;; Internal function so that we don't keep checking
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7277 ;; efs-compute-remote-buffer-file-truename, etc, as we recurse.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7278 (let ((dir (efs-file-name-directory filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7279 target dirfile)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7280 ;; Get the truename of the directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7281 (setq dirfile (efs-directory-file-name dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7282 ;; If these are equal, we have the (or a) root directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7283 (or (string= dir dirfile)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7284 (setq dir (efs-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7285 (efs-internal-file-truename dirfile))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7286 (if (equal ".." (efs-file-name-nondirectory filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7287 (efs-directory-file-name (efs-file-name-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7288 (efs-directory-file-name dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7289 (if (equal "." (efs-file-name-nondirectory filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7290 (efs-directory-file-name dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7291 ;; Put it back on the file name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7292 (setq filename (concat dir (efs-file-name-nondirectory filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7293 ;; Is the file name the name of a link?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7294 (setq target (efs-file-symlink-p filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7295 (if target
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7296 ;; Yes => chase that link, then start all over
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7297 ;; since the link may point to a directory name that uses links.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7298 ;; We can't safely use expand-file-name here
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7299 ;; since target might look like foo/../bar where foo
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7300 ;; is itself a link. Instead, we handle . and .. above.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7301 (if (file-name-absolute-p target)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7302 (efs-internal-file-truename target)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7303 (efs-internal-file-truename (concat dir target)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7304 ;; No, we are done!
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7305 filename)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7306
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7307
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7308 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7309 ;;;; I/O functions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7310 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7311
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7312 (efs-define-fun efs-set-buffer-file-name (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7313 ;; Sets the buffer local variables for filename appropriately.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7314 ;; A special function because Lucid and FSF do this differently.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7315 ;; This default behaviour is the lowest common denominator.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7316 (setq buffer-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7317
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7318 (defun efs-write-region (start end filename &optional append visit &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7319 ;; write-region for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7320 ;; This version accepts the V19 interpretation for the arg VISIT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7321 ;; However, making use of this within V18 may cause errors to crop up.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7322 ;; ARGS should catch the MULE coding-system argument.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7323 (if (stringp visit) (setq visit (expand-file-name visit)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7324 (setq filename (expand-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7325 (let ((parsed (efs-ftp-path filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7326 ;; Make sure that the after-write-region-hook isn't called inside
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7327 ;; the file-handler-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7328 (after-write-region-hook nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7329 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7330 (let* ((host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7331 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7332 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7333 (temp (car (efs-make-tmp-name nil host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7334 (type (efs-xfer-type nil nil host-type filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7335 (abbr (and (or (stringp visit) (eq t visit) (null visit))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7336 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7337 (if (stringp visit) visit filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7338 (buffer (current-buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7339 (b-file-name buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7340 (mod-p (buffer-modified-p)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7341 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7342 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7343 (condition-case err
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7344 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7345 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7346 (let ((executing-macro t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7347 ;; let-bind executing-macro to inhibit messaging.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7348 ;; Setting VISIT to 'quiet is more elegant.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7349 ;; But in Emacs 18, doing it this way allows
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7350 ;; us to modify the visited file modtime, so
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7351 ;; that undo's show the buffer modified.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7352 (apply 'write-region start end
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7353 temp nil visit args))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7354 ;; buffer-modified-p is now correctly set
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7355 (setq buffer-file-name b-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7356 ;; File modtime is bogus, so clear.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7357 (clear-visited-file-modtime))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7358 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7359 temp nil filename parsed (if append 'append t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7360 nil (and abbr (format "Writing %s" abbr))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7361 ;; cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7362 (efs-cont (result line cont-lines) (filename buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7363 visit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7364 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7365 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7366 (list "Opening output file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7367 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7368 filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7369 ;; The new file entry will be added by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7370 ;; efs-copy-file-internal.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7371 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7372 ((eq visit t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7373 ;; This will run asynch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7374 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7375 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7376 (efs-set-buffer-file-name filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7377 (efs-set-visited-file-modtime)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7378 ((stringp visit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7379 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7380 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7381 (efs-set-buffer-file-name visit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7382 (set-visited-file-modtime)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7383 nil type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7384 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7385 ;; restore buffer-modified-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7386 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7387 (set-buffer-modified-p mod-p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7388 (signal (car err) (cdr err))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7389 (if (or (eq visit t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7390 (and (stringp visit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7391 (efs-ftp-path visit)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7392 (efs-set-buffer-mode)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7393 (efs-del-tmp-name temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7394 (and abbr (efs-message "Wrote %s" abbr)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7395 (if (and (stringp visit) (efs-ftp-path visit))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7396 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7397 (apply 'write-region start end filename append visit args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7398 (efs-set-buffer-file-name visit)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7399 (efs-set-visited-file-modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7400 (efs-set-buffer-mode))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7401 (error "efs-write-region called for a local file")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7402
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7403 (defun efs-insert-file-contents (filename &optional visit &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7404 ;; Inserts file contents for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7405 ;; The additional ARGS covers V19 BEG and END. Should also handle the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7406 ;; CODING-SYSTEM arg for mule. Hope the two don't trip over each other.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7407 (barf-if-buffer-read-only)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7408 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7409 (let* ((filename (expand-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7410 (parsed (efs-ftp-path filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7411 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7412 (host-type (efs-host-type host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7413 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7414 (path (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7415 (buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7416
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7417 (if (or (file-exists-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7418 (let* ((res (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7419 (not (efs-get-host-property host 'rnfr-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7420 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7421 host user (list 'quote 'rnfr path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7422 (line (nth 1 res)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7423 ;; RNFR returns a 550 if the file doesn't exist.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7424 (if (and line (>= (length line) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7425 (string-equal "550 " (substring line 0 4)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7426 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7427 (if (car res) (efs-set-host-property host 'rnfr-failed t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7428 (efs-del-from-ls-cache filename t nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7429 (efs-del-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7430 (efs-canonize-file-name (file-name-directory filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7431 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7432 (file-exists-p filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7433
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7434 (let ((temp (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7435 (car (efs-make-tmp-name nil host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7436 (efs-internal-file-name-extension filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7437 (type (efs-xfer-type host-type filename nil nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7438 (abbr (efs-relativize-filename filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7439 (i-f-c-size 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7440
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7441 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7442 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7443 filename parsed temp nil t nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7444 (format "Retrieving %s" abbr)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7445 (efs-cont (result line cont-lines) (filename visit buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7446 host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7447 temp args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7448 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7449 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7450 (list "Opening input file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7451 (format "FTP Error: \"%s\""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7452 line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7453 filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7454 (if (eq host-type 'coke)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7455 (efs-coke-insert-beverage-contents buffer filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7456 line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7457 (efs-save-buffer-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7458 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7459 (if (or (file-readable-p temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7460 (sleep-for efs-retry-time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7461 ;; Wait for file to hopefully appear.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7462 (file-readable-p temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7463
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7464 (setq i-f-c-size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7465 (nth 1 (apply 'insert-file-contents
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7466 temp visit args)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7467 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7468 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7469 "Opening input file:"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7470 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7471 "FTP Error: %s not arrived or readable"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7472 filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7473 ;; This is done asynch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7474 (if visit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7475 (let ((buffer-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7476 (efs-set-visited-file-modtime)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7477 nil type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7478 (efs-del-tmp-name temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7479 ;; Return (FILENAME SIZE)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7480 (list filename i-f-c-size))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7481 (signal 'file-error (list "Opening input file" filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7482 ;; Set buffer-file-name at the very last, so if anything bombs, we're
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7483 ;; not visiting.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7484 (if visit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7485 (efs-set-buffer-file-name filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7486
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7487 (defun efs-revert-buffer (arg noconfirm)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7488 "Revert this buffer from a remote file using ftp."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7489 (let ((opoint (point)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7490 (cond ((null buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7491 (error "Buffer does not seem to be associated with any file"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7492 ((or noconfirm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7493 (yes-or-no-p (format "Revert buffer from file %s? "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7494 buffer-file-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7495 (let ((buffer-read-only nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7496 ;; Set buffer-file-name to nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7497 ;; so that we don't try to lock the file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7498 (let ((buffer-file-name nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7499 (unlock-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7500 (erase-buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7501 (insert-file-contents buffer-file-name t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7502 (goto-char (min opoint (point-max)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7503 (after-find-file nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7504 t))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7505
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7506 (defun efs-recover-file (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7507 ;; Version of recover file for remote files, and remote autosave files too.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7508 (if (auto-save-file-name-p file) (error "%s is an auto-save file" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7509 (let* ((file-name (let ((buffer-file-name file)) (make-auto-save-file-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7510 (file-name-parsed (efs-ftp-path file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7511 (file-parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7512 (efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7513 (cond ((not (file-newer-than-file-p file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7514 (error "Auto-save file %s not current" file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7515 ((save-window-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7516 (or (eq system-type 'vax-vms)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7517 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7518 (with-output-to-temp-buffer "*Directory*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7519 (buffer-disable-undo standard-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7520 (if file-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7521 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7522 (princ (format "On the host %s:\n"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7523 (car file-parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7524 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7525 (let ((default-directory exec-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7526 (efs-ls file (if (file-symlink-p file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7527 "-lL" "-l")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7528 t t))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7529 (princ "On the local host:\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7530 (let ((default-directory exec-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7531 (call-process "ls" nil standard-output nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7532 (if (file-symlink-p file) "-lL" "-l")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7533 file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7534 (princ "\nAUTO SAVE FILE on the ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7535 (if file-name-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7536 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7537 (princ (format "host %s:\n"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7538 (car file-name-parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7539 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7540 (efs-ls file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7541 (if (file-symlink-p file-name) "-lL" "-l")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7542 t t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7543 (princ "local host:\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7544 (let ((default-directory exec-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7545 (call-process "ls" nil standard-output nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7546 "-l" file-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7547 (princ "\nFile modification times are given in ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7548 (princ "the local time of each host.\n"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7549 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7550 (set-buffer "*Directory*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7551 (goto-char (point-min))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7552 (while (not (eobp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7553 (end-of-line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7554 (if (> (current-column) (window-width))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7555 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7556 (skip-chars-backward " \t")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7557 (skip-chars-backward "^ \t\n")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7558 (if (> (current-column) 12)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7559 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7560 (delete-horizontal-space)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7561 (insert "\n ")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7562 (forward-line 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7563 (set-buffer-modified-p nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7564 (goto-char (point-min)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7565 (yes-or-no-p (format "Recover using this auto save file? ")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7566 (switch-to-buffer (find-file-noselect file t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7567 (let ((buffer-read-only nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7568 (erase-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7569 (insert-file-contents file-name nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7570 (after-find-file nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7571 (t (error "Recover-file cancelled."))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7572 ;; This is no longer done in V19. However, I like the caution for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7573 ;; remote files, where file-newer-than-file-p may lie.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7574 (setq buffer-auto-save-file-name nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7575 (message "Auto-save off in this buffer till you do M-x auto-save-mode."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7576
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7577 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7578 ;;;; Attributes of files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7579 ;;;; ------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7580
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7581 (defun efs-file-symlink-p (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7582 ;; Version of file-symlink-p for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7583 ;; Call efs-expand-file-name rather than the normal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7584 ;; expand-file-name to stop loops when using a package that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7585 ;; redefines both file-symlink-p and expand-file-name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7586 ;; Do not use efs-get-file-entry, because a child-lookup won't do.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7587 (let* ((file (efs-expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7588 (ignore-case (memq (efs-host-type (car (efs-ftp-path file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7589 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7590 (file-type (car (efs-get-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7591 (efs-get-file-part file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7592 (efs-get-files (file-name-directory file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7593 ignore-case))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7594 (and (stringp file-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7595 (if (file-name-absolute-p file-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7596 (efs-replace-path-component file file-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7597 file-type))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7598
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7599 (defun efs-file-exists-p (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7600 ;; file-exists-p for remote file. Uses the cache if possible.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7601 (let* ((path (expand-file-name path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7602 (parsed (efs-ftp-path path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7603 (efs-internal-file-exists-p (efs-host-type (car parsed) (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7604 path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7605
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7606 (efs-defun efs-internal-file-exists-p nil (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7607 (and (efs-get-file-entry path) t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7608
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7609 (defun efs-file-directory-p (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7610 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7611 (parsed (efs-ftp-path file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7612 (efs-internal-file-directory-p (efs-host-type (car parsed) (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7613 file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7614
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7615 (efs-defun efs-internal-file-directory-p nil (path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7616 ;; Version of file-directory-p for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7617 (let ((parsed (efs-ftp-path path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7618 (or (string-equal (nth 2 parsed) "/") ; root is always a directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7619 (let ((file-ent (car (efs-get-file-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7620 (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7621 (efs-host-type (car parsed) (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7622 path)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7623 ;; We do a file-name-as-directory on path here because some
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7624 ;; machines (VMS) use a .DIR to indicate the filename associated
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7625 ;; with a directory. This needs to be canonicalized.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7626 (if (stringp file-ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7627 (efs-internal-file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7628 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7629 (efs-chase-symlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7630 ;; efs-internal-directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7631 ;; only loses for paths where the remote file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7632 ;; is /. This has been eliminated.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7633 (efs-internal-directory-file-name path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7634 file-ent)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7635
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7636 (defun efs-file-attributes (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7637 ;; Returns file-file-attributes for a remote file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7638 ;; For the file modtime does not return efs's cached value, as that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7639 ;; corresponds to buffer-file-modtime (i.e. the modtime of the file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7640 ;; the last time the buffer was vsisted or saved). Caching modtimes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7641 ;; does not make much sense, as they are usually used to determine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7642 ;; if a cache is stale. The modtime if a remote file can be obtained with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7643 ;; efs-get-file-mdtm. This is _not_ returned for the 5th entry here,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7644 ;; because it requires an FTP transaction, and a priori we don't know
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7645 ;; if the caller actually cares about this info. Having file-attributes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7646 ;; return such a long list of info is not well suited to remote files,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7647 ;; as some of this info may be costly to obtain.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7648 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7649 (ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7650 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7651 (let* ((parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7652 (host (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7653 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7654 (path (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7655 (type (car ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7656 (size (or (nth 1 ent) -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7657 (owner (nth 2 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7658 (modes (nth 3 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7659 ;; Hack to give remote files a "unique" "inode number".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7660 ;; It's actually the sum of the characters in its name.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7661 ;; It's not even really unique.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7662 (inode (apply '+
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7663 (nconc (mapcar 'identity host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7664 (mapcar 'identity user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7665 (mapcar 'identity
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7666 (efs-internal-directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7667 path)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7668 (nlinks (or (nth 4 ent) -1))) ; return -1 if we don't know
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7669 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7670 (if (and (stringp type) (file-name-absolute-p type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7671 (efs-replace-path-component file type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7672 type) ;0 file type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7673 nlinks ;1 link count
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7674 (if owner ;2 uid
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7675 ;; Not really a unique integer,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7676 ;; just a half-hearted attempt
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7677 (apply '+ (mapcar 'identity owner))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7678 -1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7679 -1 ;3 gid
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7680 '(0 0) ;4 atime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7681 '(0 0) ;5 mtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7682 '(0 0) ;6 ctime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7683 size ;7 size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7684 (or modes ;8 mode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7685 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7686 (cond ((stringp type) "l")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7687 (type "d")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7688 (t "-"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7689 "?????????"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7690 nil ;9 gid weird (Who knows if the gid
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7691 ; would be changed?)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7692 inode ;10 inode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7693 -1 ;11 device number [v19 only]
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7694 )))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7695
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7696 (defun efs-file-writable-p (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7697 ;; file-writable-p for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7698 ;; Does not attempt to open the file, but just looks at the cached file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7699 ;; modes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7700 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7701 (ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7702 (if (and ent (or (not (stringp (car ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7703 (setq file (efs-chase-symlinks file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7704 ent (efs-get-file-entry file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7705 (let* ((owner (nth 2 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7706 (modes (nth 3 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7707 (parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7708 (host-type (efs-host-type (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7709 (user (nth 1 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7710 (if (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7711 (setq host-type 'unix))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7712 (efs-internal-file-writable-p host-type user owner modes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7713 (let ((dir (file-name-directory file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7714 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7715 (not (string-equal dir file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7716 (file-directory-p dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7717 (file-writable-p dir))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7718
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7719 (efs-defun efs-internal-file-writable-p nil (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7720 ;; By default, we'll just guess yes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7721 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7722
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7723 (efs-defun efs-internal-file-writable-p unix (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7724 (if (and modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7725 (not (string-equal user "root")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7726 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7727 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7728 (if (string-equal user owner)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7729 (memq ?w (list (aref modes 2) (aref modes 5)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7730 (aref modes 8)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7731 (memq ?w (list (aref modes 5) (aref modes 8))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7732 t)) ; guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7733
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7734 (defun efs-file-readable-p (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7735 ;; Version of file-readable-p that works for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7736 ;; Works by checking efs's cache of the file modes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7737 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7738 (ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7739 (and ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7740 (or (not (stringp (car ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7741 (setq ent (efs-get-file-entry (efs-chase-symlinks file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7742 ;; file exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7743 (let* ((parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7744 (owner (nth 2 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7745 (modes (nth 3 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7746 (host-type (efs-host-type (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7747 (user (nth 1 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7748 (if (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7749 (setq host-type 'unix))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7750 (efs-internal-file-readable-p host-type user owner modes)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7751
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7752 (efs-defun efs-internal-file-readable-p nil (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7753 ;; Guess t by default
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7754 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7755
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7756 (efs-defun efs-internal-file-readable-p unix (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7757 (if (and modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7758 (not (string-equal user "root")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7759 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7760 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7761 (if (string-equal user owner)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7762 (memq ?r (list (aref modes 1) (aref modes 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7763 (aref modes 7)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7764 (memq ?r (list (aref modes 4) (aref modes 7))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7765 t)) ; guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7766
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7767 (defun efs-file-executable-p (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7768 ;; Version of file-executable-p for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7769 (let ((ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7770 (and ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7771 (or (not (stringp (car ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7772 (setq ent (efs-get-file-entry (efs-chase-symlinks file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7773 ;; file exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7774 (let* ((parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7775 (owner (nth 2 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7776 (modes (nth 3 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7777 (host-type (efs-host-type (car parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7778 (user (nth 1 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7779 (if (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7780 (setq host-type 'unix))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7781 (efs-internal-file-executable-p host-type user owner modes)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7782
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7783 (efs-defun efs-internal-file-executable-p nil (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7784 ;; Guess t by default
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7785 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7786
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7787 (efs-defun efs-internal-file-executable-p unix (user owner modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7788 (if (and modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7789 (not (string-equal user "root")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7790 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7791 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7792 (if (string-equal user owner)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7793 (memq ?x (list (aref modes 3) (aref modes 6)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7794 (aref modes 9)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7795 (memq ?x (list (aref modes 6) (aref modes 9))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7796 t)) ; guess
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7797
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7798 (defun efs-file-accessible-directory-p (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7799 ;; Version of file-accessible-directory-p for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7800 (let ((file (directory-file-name dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7801 (and (efs-file-directory-p file) (efs-file-executable-p file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7802
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7803 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7804 ;;;; Listing directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7805 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7806
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7807 (defun efs-shell-regexp-to-regexp (regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7808 ;; Converts a shell regexp to an emacs regexp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7809 ;; Probably full of bugs. Tries to follow csh globbing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7810 (let ((curly 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7811 backslash)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7812 (concat "^"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7813 (mapconcat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7814 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7815 (lambda (char)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7816 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7817 (backslash
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7818 (setq backslash nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7819 (regexp-quote (char-to-string char)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7820 ((and (> curly 0) (eq char ?,))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7821 "\\|")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7822 ((memq char '(?[ ?]))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7823 (char-to-string char))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7824 ((eq char ??)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7825 ".")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7826 ((eq char ?\\)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7827 (setq backslash t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7828 "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7829 ((eq char ?*)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7830 ".*")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7831 ((eq char ?{)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7832 (setq curly (1+ curly))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7833 "\\(")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7834 ((and (eq char ?}) (> curly 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7835 (setq curly (1- curly))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7836 "\\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7837 (t (regexp-quote (char-to-string char))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7838 regexp nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7839 "$")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7840
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7841
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7842 ;;; Getting directory listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7843
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7844 (defun efs-directory-files (directory &optional full match nosort)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7845 ;; Returns directory-files for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7846 ;; NOSORT is a V19 arg.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7847 (let* ((directory (expand-file-name directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7848 (parsed (efs-ftp-path directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7849 (directory (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7850 (efs-host-type (car parsed) (nth 1 parsed)) directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7851 files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7852 (efs-barf-if-not-directory directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7853 (setq files (efs-hash-table-keys (efs-get-files directory) nosort))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7854 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7855 ((null (or full match))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7856 files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7857 (match ; this is slow case
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7858 (let (res f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7859 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7860 (while files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7861 (setq f (if full (concat directory (car files)) (car files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7862 files (cdr files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7863 (if (string-match match f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7864 (setq res (nconc res (list f))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7865 res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7866 (full
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7867 (mapcar (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7868 (lambda (fn)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7869 (concat directory fn)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7870 files)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7871
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7872 (defun efs-list-directory (dirname &optional verbose)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7873 ;; Version of list-directory for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7874 ;; If verbose is nil, it gets its information from efs's
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7875 ;; internal cache.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7876 (let* ((dirname (expand-file-name (or dirname default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7877 header)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7878 (if (file-directory-p dirname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7879 (setq dirname (file-name-as-directory dirname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7880 (setq header dirname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7881 (with-output-to-temp-buffer "*Directory*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7882 (buffer-disable-undo standard-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7883 (princ "Directory ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7884 (princ header)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7885 (terpri)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7886 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7887 (efs-ls dirname (if verbose
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7888 list-directory-verbose-switches
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7889 list-directory-brief-switches)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7890 t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7891
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7892 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7893 ;;;; Manipulating buffers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7894 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7895
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7896 (defun efs-get-file-buffer (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7897 ;; Version of get-file-buffer for remote files. Needs to fuss over things
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7898 ;; like OS's which are case-insens. for file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7899 (let ((file (efs-canonize-file-name (expand-file-name file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7900 (buff-list (buffer-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7901 buff-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7902 (catch 'match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7903 (while buff-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7904 (and (setq buff-name (buffer-file-name (car buff-list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7905 (= (length buff-name) (length file)) ; efficiency hack
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7906 (string-equal (efs-canonize-file-name buff-name) file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7907 (throw 'match (car buff-list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7908 (setq buff-list (cdr buff-list))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7909
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7910 (defun efs-create-file-buffer (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7911 ;; Version of create-file-buffer for remote file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7912 (let* ((parsed (efs-ftp-path (expand-file-name filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7913 (file (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7914 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7915 (host-type (efs-host-type host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7916 (buff (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7917 ((null efs-fancy-buffer-names)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7918 (if (string-equal file "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7919 "/"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7920 (efs-internal-file-name-nondirectory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7921 (efs-internal-directory-file-name file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7922 ((stringp efs-fancy-buffer-names)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7923 (format efs-fancy-buffer-names
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7924 (if (string-equal file "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7925 "/"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7926 (efs-internal-file-name-nondirectory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7927 (efs-internal-directory-file-name file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7928 (substring host 0 (string-match "\\." host 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7929 (t ; efs-fancy-buffer-names had better be a function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7930 (funcall efs-fancy-buffer-names host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7931 (nth 1 parsed) file)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7932 (if (memq host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7933 (cond ((eq efs-buffer-name-case 'down)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7934 (setq buff (downcase buff)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7935 ((eq efs-buffer-name-case 'up)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7936 (setq buff (upcase buff)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7937 (get-buffer-create (generate-new-buffer-name buff))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7938
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7939 (defun efs-set-buffer-mode ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7940 "Set correct modes for the current buffer if it is visiting a remote file."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7941 (if (and (stringp buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7942 (efs-ftp-path buffer-file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7943 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7944 (auto-save-mode efs-auto-save)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7945 (set (make-local-variable 'revert-buffer-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7946 'efs-revert-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7947 (set (make-local-variable 'default-directory-function)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7948 'efs-default-dir-function))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7949
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7950 ;;;; ---------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7951 ;;;; Functions for doing backups.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7952 ;;;; ---------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7953
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7954 (defun efs-backup-buffer ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7955 ;; Version of backup-buffer for buffers visiting remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7956 (if efs-make-backup-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7957 (let* ((parsed (efs-ftp-path buffer-file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7958 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7959 (host-type (efs-host-type (car parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7960 (if (or (not (listp efs-make-backup-files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7961 (memq host-type efs-make-backup-files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7962 (efs-internal-backup-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7963 host host-type (nth 1 parsed) (nth 2 parsed))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7964
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7965 (defun efs-internal-backup-buffer (host host-type user remote-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7966 ;; This is almost a copy of the function in files.el, modified
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7967 ;; to check to see if the backup file exists, before deleting it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7968 ;; It also supports efs-backup-by-copying, and tries to do the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7969 ;; right thing about backup-by-copying-when-mismatch. Only called
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7970 ;; for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7971 ;; Set the umask now, so that `setmodes' knows about it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7972 (efs-set-umask host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7973 (let ((ent (efs-get-file-entry (expand-file-name buffer-file-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7974 ;; Never do version-control if the remote operating system is doing it.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7975 (version-control (if (memq host-type efs-version-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7976 'never
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7977 version-control))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7978 modstring)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7979 (and make-backup-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7980 (not buffer-backed-up)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7981 ent ; i.e. file-exists-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7982 (not (eq t (car ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7983 (or (null (setq modstring (nth 3 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7984 (not (memq host-type efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7985 (memq (aref modstring 0) '(?- ?l)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7986 (or (< (length remote-path) 5)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7987 (not (string-equal "/tmp/" (substring remote-path 0 5))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7988 (condition-case ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7989 (let* ((backup-info (find-backup-file-name buffer-file-name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7990 (backupname (car backup-info))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7991 (targets (cdr backup-info))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7992 (links (nth 4 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7993 setmodes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7994 (condition-case ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7995 (if (or file-precious-flag
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7996 (stringp (car ent)) ; symlinkp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7997 efs-backup-by-copying
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7998 (and backup-by-copying-when-linked
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
7999 links (> links 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8000 (and backup-by-copying-when-mismatch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8001 (not
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8002 (if (memq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8003 host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8004 efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8005 (string-equal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8006 (downcase user) (downcase (nth 2 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8007 (string-equal user (nth 2 ent))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8008 (copy-file buffer-file-name backupname t t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8009 (condition-case ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8010 (if (file-exists-p backupname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8011 (delete-file backupname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8012 (file-error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8013 (rename-file buffer-file-name backupname t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8014 (setq setmodes (file-modes backupname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8015 (file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8016 ;; If trouble writing the backup, write it in ~.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8017 (setq backupname (expand-file-name "~/%backup%~"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8018 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8019 "Cannot write backup file; backing up in ~/%%backup%%~")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8020 (sleep-for 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8021 (copy-file buffer-file-name backupname t t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8022 (setq buffer-backed-up t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8023 ;; Starting with 19.26, trim-versions-without-asking
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8024 ;; has been renamed to delete-old-verions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8025 (if (and targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8026 (or (if (boundp 'trim-versions-without-asking)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8027 trim-versions-without-asking
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8028 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8029 (boundp 'delete-old-versions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8030 delete-old-versions))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8031 (y-or-n-p (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8032 "Delete excess backup versions of %s? "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8033 buffer-file-name))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8034 (while targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8035 (condition-case ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8036 (delete-file (car targets))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8037 (file-error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8038 (setq targets (cdr targets))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8039 ;; If the file was already written with the right modes,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8040 ;; don't return set-modes.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8041 (and setmodes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8042 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8043 (let ((buff (get-buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8044 (efs-ftp-process-buffer host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8045 (and buff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8046 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8047 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8048 (and (integerp efs-process-umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8049 (= (efs-modes-from-umask efs-process-umask)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8050 setmodes))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8051 setmodes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8052 (file-error nil)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8053
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8054 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8055 ;;;; Redefinition for Emacs file mode support
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8056 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8057
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8058 (defmacro efs-build-mode-string-element (int suid-p sticky-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8059 ;; INT is between 0 and 7.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8060 ;; If SUID-P is non-nil, we are building the 3-char string for either
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8061 ;; the owner or group, and the s[ug]id bit is set.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8062 ;; If STICKY-P is non-nil, we are building the string for other perms,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8063 ;; and the sticky bit is set.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8064 ;; It doesn't make sense for both SUID-P and STICKY-P be non-nil!
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8065 (` (let* ((int (, int))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8066 (suid-p (, suid-p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8067 (sticky-p (, sticky-p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8068 (read-bit (if (memq int '(4 5 6 7)) "r" "-"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8069 (write-bit (if (memq int '(2 3 6 7)) "w" "-"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8070 (x-bit (if (memq int '(1 3 5 7))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8071 (cond (suid-p "s") (sticky-p "t") ("x"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8072 (cond (suid-p "S") (sticky-p "T") ("-")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8073 (concat read-bit write-bit x-bit))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8074
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8075 (defun efs-mode-string (int)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8076 ;; Takes an octal integer between 0 and 7777, and returns the 9 character
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8077 ;; mode string.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8078 (let* ((other-int (% int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8079 (int (/ int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8080 (group-int (% int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8081 (int (/ int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8082 (owner-int (% int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8083 (int (/ int 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8084 (suid (memq int '(4 5 6 7)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8085 (sgid (memq int '(2 3 6 7)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8086 (sticky (memq int '(1 3 5 7))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8087 (concat (efs-build-mode-string-element owner-int suid nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8088 (efs-build-mode-string-element group-int sgid nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8089 (efs-build-mode-string-element other-int nil sticky))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8090
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8091 (defun efs-set-file-modes (file mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8092 ;; set-file-modes for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8093 ;; For remote files, if mode is nil, does nothing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8094 ;; This is because efs-file-modes returns nil if the modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8095 ;; of a remote file couldn't be determined, even if the file exists.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8096 (and mode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8097 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8098 (parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8099 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8100 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8101 (r-file (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8102 ;; convert to octal, and keep only 12 lowest order bits.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8103 (omode (format "%o" (- mode (lsh (lsh mode -12) 12)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8104 (if (or (efs-get-host-property host 'chmod-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8105 (null (memq (efs-host-type host user) efs-unix-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8106 (message "Unable to set file modes for %s to %s." file omode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8107 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8108 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8109 (list 'quote 'site 'chmod omode r-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8110 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8111 (efs-cont (result line cont-lines) (host file r-file omode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8112 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8113 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8114 (efs-set-host-property host 'chmod-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8115 (message "CHMOD %s failed for %s on %s." omode r-file host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8116 (if efs-ding-on-chmod-failure
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8117 (progn (ding) (sit-for 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8118 (let ((ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8119 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8120 (let* ((type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8121 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8122 ((null (car ent)) "-")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8123 ((eq (car ent) t) "d")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8124 ((stringp (car ent)) "s")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8125 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8126 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8127 "Weird error in efs-set-file-modes"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8128 (mode-string (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8129 type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8130 (efs-mode-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8131 (string-to-int omode))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8132 (tail (nthcdr 3 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8133 (if (consp tail)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8134 (setcar tail mode-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8135 (efs-add-file-entry nil file (car ent) (nth 1 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8136 (nth 2 ent) mode-string)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8137 0)))) ; It should be safe to do this NOWAIT = 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8138 ;; set-file-modes returns nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8139 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8140
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8141 (defmacro efs-parse-mode-element (modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8142 ;; Parses MODES, a string of three chars, and returns an integer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8143 ;; between 0 and 7 according to how unix file modes are represented
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8144 ;; for chmod.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8145 (` (if (= (length (, modes)) 3)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8146 (let ((list (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8147 (function (lambda (char)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8148 (if (memq char '( ?- ?S ?T)) 0 1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8149 (, modes))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8150 ;; Convert to octal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8151 (+ (* (car list) 4) (* (nth 1 list) 2) (nth 2 list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8152 (error "Can't parse modes %s" (, modes)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8153
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8154 (defun efs-parse-mode-string (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8155 ;; Parse a 9-character mode string, and return what it represents
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8156 ;; as a decimal integer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8157 (let ((owner (efs-parse-mode-element (substring string 0 3)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8158 (group (efs-parse-mode-element (substring string 3 6)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8159 (other (efs-parse-mode-element (substring string 6 9)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8160 (owner-x (elt string 2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8161 (group-x (elt string 5))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8162 (other-x (elt string 8)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8163 (+ (* (+ (if (memq owner-x '(?s ?S)) 4 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8164 (if (memq group-x '(?s ?S)) 2 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8165 (if (memq other-x '(?t ?T)) 1 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8166 512)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8167 (* owner 64)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8168 (* group 8)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8169 other)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8170
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8171 (defun efs-file-modes (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8172 ;; Version of file-modes for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8173 ;; Returns nil if the file modes can't be determined, either because
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8174 ;; the file doesn't exist, or for any other reason.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8175 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8176 (parsed (efs-ftp-path file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8177 (and (memq (efs-host-type (car parsed)) efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8178 ;; Someday we should cache mode strings for non-unix, but they
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8179 ;; won't be in unix format. Also, CHMOD doesn't work for non-unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8180 ;; hosts, so returning this info to emacs is a waste.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8181 (let* ((ent (efs-get-file-entry file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8182 (modes (nth 3 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8183 (and modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8184 (efs-parse-mode-string (substring modes 1)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8185
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8186 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8187 ;;;; Redefinition of Emacs file modtime support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8188 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8189
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8190 (defun efs-day-number (year month day)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8191 ;; Returns the day number within year of date. Taken from calendar.el,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8192 ;; by Edward Reingold. Thanks.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8193 ;; An explanation of the calculation can be found in PascAlgorithms by
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8194 ;; Edward and Ruth Reingold, Scott-Foresman/Little, Brown, 1988.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8195 (let ((day-of-year (+ day (* 31 (1- month)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8196 (if (> month 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8197 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8198 (setq day-of-year (- day-of-year (/ (+ 23 (* 4 month)) 10)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8199 (if (zerop (% year 4))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8200 (setq day-of-year (1+ day-of-year)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8201 day-of-year))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8202
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8203 (defun efs-days-elapsed (year month day)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8204 ;; Number of days elapsed since Jan 1, `efs-time-zero'
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8205 (+ (efs-day-number year month day) ; days this year
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8206 (* 365 (- year efs-time-zero)) ; days in prior years
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8207 (- (/ (max (1- year) efs-time-zero) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8208 (/ efs-time-zero 4)) ; leap years
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8209 -1 )) ; don't count today
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8210
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8211 ;; 2^16 = 65536
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8212 ;; Use this to avoid overflows
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8213
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8214 (defun efs-seconds-elapsed (year month day hours minutes seconds)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8215 ;; Computes the seconds elapsed from `efs-time-zero', in emacs'
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8216 ;; format of a list of two integers, the first the higher 16-bits,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8217 ;; the second the lower 16-bits.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8218 (let* ((days (efs-days-elapsed year month day))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8219 ;; compute hours
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8220 (hours (+ (* 24 days) hours))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8221 (high (lsh hours -16))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8222 (low (- hours (lsh high 16)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8223 ;; compute minutes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8224 (low (+ (* low 60) minutes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8225 (carry (lsh low -16))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8226 (high (+ (* high 60) carry))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8227 (low (- low (lsh carry 16)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8228 ;; compute seconds
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8229 (low (+ (* low 60) seconds))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8230 (carry (lsh low -16))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8231 (high (+ (* high 60) carry))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8232 (low (- low (lsh carry 16))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8233 (list high low)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8234
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8235 (defun efs-parse-mdtime (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8236 ;; Parse a string, which is assumed to be the result of an ftp MDTM command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8237 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8238 (if (string-match efs-mdtm-msgs string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8239 (efs-seconds-elapsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8240 (string-to-int (substring string 4 8))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8241 (string-to-int (substring string 8 10))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8242 (string-to-int (substring string 10 12))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8243 (string-to-int (substring string 12 14))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8244 (string-to-int (substring string 14 16))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8245 (string-to-int (substring string 16 18))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8246
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8247 (defun efs-parse-ctime (string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8248 ;; Parse STRING which is assumed to be the result of a query over port 37.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8249 ;; Returns the number of seconds since the turn of the century, as a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8250 ;; list of two 16-bit integers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8251 (and (= (length string) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8252 (list (+ (lsh (aref string 0) 8) (aref string 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8253 (+ (lsh (aref string 2) 8) (aref string 3)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8254
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8255 (defun efs-time-minus (time1 time2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8256 ;; Subtract 32-bit integers, represented as two 16-bit integers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8257 (let ((high (- (car time1) (car time2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8258 (low (- (nth 1 time1) (nth 1 time2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8259 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8260 ((and (< high 0) (> low 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8261 (setq high (1+ high)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8262 low (- low 65536)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8263 ((and (> high 0) (< low 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8264 (setq high (1- high)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8265 low (+ 65536 low))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8266 (list high low)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8267
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8268 (defun efs-time-greater (time1 time2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8269 ;; Compare two 32-bit integers, each represented as a list of two 16-bit
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8270 ;; integers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8271 (or (> (car time1) (car time2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8272 (and (= (car time1) (car time2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8273 (> (nth 1 time1) (nth 1 time2)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8274
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8275 (defun efs-century-time (host &optional nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8276 ;; Treat nil as the local host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8277 ;; Returns the # of seconds since the turn of the century, according
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8278 ;; to the system clock on host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8279 ;; CONT is called with first arg HOST and second the # of seconds.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8280 (or host (setq host (system-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8281 (efs-set-host-property host 'last-ctime nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8282 (efs-set-host-property host 'ctime-cont cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8283 (let ((name (format efs-ctime-process-name-format host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8284 proc)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8285 (condition-case nil (delete-process name) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8286 (if (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8287 (or (efs-save-match-data (string-match efs-local-host-regexp host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8288 (string-equal host (system-name)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8289 (setq proc (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8290 (open-network-stream name nil host 37)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8291 (error nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8292 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8293 (set (intern name) "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8294 (set-process-filter
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8295 proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8296 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8297 (lambda (proc string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8298 (let ((name (process-name proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8299 result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8300 (set (intern name) (concat (symbol-value (intern name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8301 string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8302 (setq result (efs-parse-ctime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8303 (symbol-value (intern name))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8304 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8305 (let* ((host (substring name 11 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8306 (cont (efs-get-host-property host 'ctime-cont)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8307 (efs-set-host-property host 'last-ctime result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8308 (condition-case nil (delete-process proc) (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8309 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8310 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8311 (efs-set-host-property host 'ctime-cont nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8312 (efs-call-cont cont host result)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8313 (set-process-sentinel
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8314 proc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8315 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8316 (lambda (proc state)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8317 (let* ((name (process-name proc))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8318 (host (substring name 11 -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8319 (cont (efs-get-host-property host 'ctime-cont)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8320 (makunbound (intern name))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8321 (or (efs-get-host-property host 'last-ctime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8322 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8323 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8324 (efs-set-host-property host 'ctime-cont nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8325 (efs-call-cont cont host 'failed))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8326 (if nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8327 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8328 (let ((quit-flag nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8329 (inhibit-quit nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8330 (while (memq (process-status proc) '(run open))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8331 (accept-process-output)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8332 (accept-process-output)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8333 (or (efs-get-host-property host 'last-ctime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8334 'failed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8335 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8336 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8337 (efs-set-host-property host 'ctime-cont nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8338 (efs-call-cont cont host 'failed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8339 (if nowait nil 'failed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8340
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8341 (defun efs-clock-difference (host &optional nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8342 ;; clock difference with the local host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8343 (let ((result (efs-get-host-property host 'clock-diff)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8344 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8345 result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8346 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8347 (efs-century-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8348 host nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8349 (efs-cont (host result) (nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8350 (if (eq result 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8351 (efs-set-host-property host 'clock-diff 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8352 (efs-century-time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8353 nil nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8354 (efs-cont (lhost lresult) (host result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8355 (if (eq lresult 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8356 (efs-set-host-property host 'clock-diff 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8357 (efs-set-host-property host 'clock-diff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8358 (efs-time-minus result lresult))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8359 (and (null nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8360 (or (efs-get-host-property host 'clock-diff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8361 'failed))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8362
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8363 (defun efs-get-file-mdtm (host user file path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8364 "For HOST and USER, return FILE's last modification time.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8365 PATH is the file name in full efs syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8366 Returns a list of two six-digit integers which represent the 16 high order
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8367 bits, and 16 low order bits of the number of elapsed seconds since
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8368 `efs-time-zero'"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8369 (and (null (efs-get-host-property host 'mdtm-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8370 (let ((result (efs-send-cmd host user (list 'quote 'mdtm file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8371 (and (eq efs-verbose t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8372 "Getting modtime")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8373 parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8374 (if (and (null (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8375 (setq parsed (efs-parse-mdtime (nth 1 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8376 (let ((ent (efs-get-file-entry path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8377 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8378 (setcdr ent (list (nth 1 ent) (nth 2 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8379 (nth 3 ent) (nth 4 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8380 parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8381 parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8382 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8383 ;; The 550 error is for a nonexistent file. Actually implies
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8384 ;; that MDTM works.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8385 (if (string-match "^550 " (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8386 '(0 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8387 (efs-set-host-property host 'mdtm-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8388 nil))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8389
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8390 (efs-define-fun efs-set-emacs-bvf-mdtm (buffer mdtm)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8391 ;; Sets cached value for the buffer visited file modtime.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8392 (if (get-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8393 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8394 (set-buffer buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8395 (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8396 (set-visited-file-modtime mdtm)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8397
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8398 ;; (defun efs-set-visited-file-modtime (&optional time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8399 ;; ;; For remote files sets the modtime for a buffer to be that of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8400 ;; ;; visited file. With arg TIME sets the modtime to TIME. TIME must be a list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8401 ;; ;; of two 16-bit integers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8402 ;; ;; The function set-visited-file-modtime is for emacs-19. It doesn't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8403 ;; ;; exist in emacs 18. If you're running efs, it will work in emacs 18 for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8404 ;; ;; remote files only.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8405 ;; (if time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8406 ;; (efs-set-emacs-bvf-mdtm (current-buffer) time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8407 ;; (let* ((path buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8408 ;; (parsed (efs-ftp-path path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8409 ;; (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8410 ;; (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8411 ;; (file (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8412 ;; (buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8413 ;; (if (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8414 ;; (and efs-verify-modtime-host-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8415 ;; (string-match efs-verify-modtime-host-regexp host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8416 ;; (or efs-verify-anonymous-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8417 ;; (not (efs-anonymous-p user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8418 ;; (not (efs-get-host-property host 'mdtm-failed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8419 ;; (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8420 ;; host user (list 'quote 'mdtm file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8421 ;; nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8422 ;; (efs-cont (result line cont-lines) (host user path buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8423 ;; (let (modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8424 ;; (if (and (null result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8425 ;; (setq modtime (efs-parse-mdtime line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8426 ;; (let ((ent (efs-get-file-entry path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8427 ;; (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8428 ;; (setcdr ent (list (nth 1 ent) (nth 2 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8429 ;; (nth 3 ent) (nth 4 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8430 ;; modtime)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8431 ;; (setq buffer (and (setq buffer (get-buffer buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8432 ;; (buffer-name buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8433 ;; ;; Beware that since this is happening asynch, the buffer
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8434 ;; ;; may have disappeared.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8435 ;; (and buffer (efs-set-emacs-bvf-mdtm buffer modtime)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8436 ;; (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8437 ;; (or (string-match "^550 " line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8438 ;; (efs-set-host-property host 'mdtm-failed t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8439 ;; (efs-set-emacs-bvf-mdtm buffer 0)))) ; store dummy values
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8440 ;; 0) ; Always do this NOWAIT = 0
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8441 ;; (efs-set-emacs-bvf-mdtm buffer 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8442 ;; nil) ; return NIL
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8443 ;; ))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8444
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8445 (defvar efs-set-modtimes-synchronously nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8446 "*Whether efs uses a synchronous FTP command to set the visited file modtime.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8447 Setting this variable to non-nil means that efs will set visited file modtimes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8448 synchronously.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8449
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8450 Asynchronous setting of visited file modtimes leaves a very small
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8451 window where Emacs may fail to detect a super session. However, it gives
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8452 faster user access to newly visited files.")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8453
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8454
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8455 (defun efs-set-visited-file-modtime (&optional time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8456 ;; For remote files sets the modtime for a buffer to be that of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8457 ;; visited file. With arg TIME sets the modtime to TIME. TIME must be a list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8458 ;; of two 16-bit integers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8459 ;; The function set-visited-file-modtime is for emacs-19. It doesn't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8460 ;; exist in emacs 18. If you're running efs, it will work in emacs 18 for
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8461 ;; remote files only.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8462 (if time
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8463 (efs-set-emacs-bvf-mdtm (current-buffer) time)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8464 (let* ((path buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8465 (parsed (efs-ftp-path path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8466 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8467 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8468 (file (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8469 (buffer (current-buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8470 (if (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8471 (and efs-verify-modtime-host-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8472 (string-match efs-verify-modtime-host-regexp host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8473 (or efs-verify-anonymous-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8474 (not (efs-anonymous-p user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8475 (not (efs-get-host-property host 'mdtm-failed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8476 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8477 (or efs-set-modtimes-synchronously (clear-visited-file-modtime))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8478 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8479 host user (list 'quote 'mdtm file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8480 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8481 (efs-cont (result line cont-lines) (host user path buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8482 (let (modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8483 (if (and (null result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8484 (setq modtime (efs-parse-mdtime line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8485 (let ((ent (efs-get-file-entry path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8486 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8487 (setcdr ent (list (nth 1 ent) (nth 2 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8488 (nth 3 ent) (nth 4 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8489 modtime)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8490 (setq buffer (and (setq buffer (get-buffer buffer))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8491 (buffer-name buffer)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8492 ;; Beware that since might be happening asynch,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8493 ;; the buffer may have disappeared.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8494 (and buffer (efs-set-emacs-bvf-mdtm buffer modtime)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8495 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8496 (or (string-match "^550 " line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8497 (efs-set-host-property host 'mdtm-failed t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8498 (efs-set-emacs-bvf-mdtm buffer '(0 0))))) ; store dummy values
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8499 (and (null efs-set-modtimes-synchronously) 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8500 (efs-set-emacs-bvf-mdtm buffer '(0 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8501 nil))) ; return NIL
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8502
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8503 (defun efs-file-newer-than-file-p (file1 file2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8504 ;; Version of file-newer-than-file-p for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8505 (let* ((file1 (expand-file-name file1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8506 (file2 (expand-file-name file2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8507 (parsed1 (efs-ftp-path file1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8508 (parsed2 (efs-ftp-path file2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8509 (host1 (car parsed1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8510 (host2 (car parsed2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8511 (user1 (nth 1 parsed1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8512 (user2 (nth 1 parsed2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8513 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8514 ;; If the first file doedn't exist, or is remote but
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8515 ;; we're not supposed to check modtimes on it, return nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8516 ((or (null (file-exists-p file1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8517 (and parsed1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8518 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8519 (null efs-verify-modtime-host-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8520 (efs-get-host-property host1 'mdtm-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8521 (not (string-match efs-verify-modtime-host-regexp host1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8522 (and (null efs-verify-anonymous-modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8523 (efs-anonymous-p user1)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8524 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8525 ;; If the same is true for the second file, return t.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8526 ((or (null (file-exists-p file2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8527 (and parsed2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8528 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8529 (null efs-verify-modtime-host-regexp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8530 (efs-get-host-property host2 'mdtm-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8531 (not (string-match efs-verify-modtime-host-regexp host2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8532 (and (null efs-verify-anonymous-modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8533 (efs-anonymous-p user2)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8534 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8535 ;; Calculate modtimes. If we get here, any remote files should
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8536 ;; have a file entry.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8537 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8538 (let (mod1 mod2 shift1 shift2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8539 (if parsed1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8540 (let ((ent (efs-get-file-entry file1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8541 (setq mod1 (nth 5 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8542 shift1 (efs-clock-difference host1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8543 (or mod1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8544 (setq mod1 (efs-get-file-mdtm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8545 host1 user1 (nth 2 parsed1) file1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8546 (setq mod1 (nth 5 (file-attributes file1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8547 (if parsed2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8548 (let ((ent (efs-get-file-entry file2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8549 (setq mod2 (nth 5 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8550 shift2 (efs-clock-difference host2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8551 (or mod2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8552 (setq mod2 (efs-get-file-mdtm
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8553 host2 user2 (nth 2 parsed2) file2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8554 (setq mod2 (nth 5 (file-attributes file2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8555 ;; If we can't compute clock shifts, we act as if we don't
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8556 ;; even know the modtime. Should we have more faith in ntp?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8557 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8558 ((or (null mod1) (eq shift1 'failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8559 nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8560 ((or (null mod2) (eq shift2 'failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8561 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8562 ;; We get to compute something!
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8563 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8564 (efs-time-greater
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8565 (if shift1 (efs-time-minus mod1 shift1) mod1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8566 (if shift2 (efs-time-minus mod2 shift2) mod2)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8567
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8568 (defun efs-verify-visited-file-modtime (buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8569 ;; Verifies the modtime for buffers visiting remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8570 ;; Won't get called for buffer not visiting any file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8571 (let ((buff (get-buffer buff)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8572 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8573 (and buff ; return t if no buffer? Need to beware of multi-threading.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8574 (buffer-file-name buff) ; t if no file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8575 (let ((mdtm (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8576 (set-buffer buff)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8577 (visited-file-modtime))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8578 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8579 (not (eq mdtm 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8580 (not (equal mdtm '(0 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8581 efs-verify-modtime-host-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8582 (let* ((path (buffer-file-name buff))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8583 (parsed (efs-ftp-path path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8584 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8585 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8586 nmdtm)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8587 (and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8588 (null (efs-get-host-property host 'mdtm-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8589 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8590 (string-match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8591 efs-verify-modtime-host-regexp host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8592 (or efs-verify-anonymous-modtime
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8593 (not (efs-anonymous-p user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8594 (setq nmdtm (efs-get-file-mdtm host user (nth 2 parsed) path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8595 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8596 (or (equal nmdtm '(0 0))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8597 (file-exists-p path) ; Make sure that there is an entry.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8598 (null
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8599 (efs-get-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8600 (file-name-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8601 (efs-internal-directory-file-name path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8602 (efs-add-file-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8603 (efs-host-type host) path nil nil nil nil nil nmdtm))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8604 (null (and (eq (cdr mdtm) (nth 1 nmdtm))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8605 (eq (car mdtm) (car nmdtm)))))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8606
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8607 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8608 ;;;; Redefinition of Emacs file name completion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8609 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8610
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8611 (defmacro efs-set-completion-ignored-pattern ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8612 ;; Set regexp efs-completion-ignored-pattern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8613 ;; to use for filename completion.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8614 (`
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8615 (or (equal efs-completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8616 completion-ignored-extensions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8617 (setq efs-completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8618 completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8619 efs-completion-ignored-pattern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8620 (mapconcat (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8621 (lambda (s) (if (stringp s)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8622 (concat (regexp-quote s) "$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8623 "/"))) ; / never in filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8624 efs-completion-ignored-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8625 "\\|")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8626
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8627 (defun efs-file-entry-active-p (sym)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8628 ;; If the file entry is a symlink, returns whether the file pointed to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8629 ;; exists.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8630 ;; Note that DIR is dynamically bound.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8631 (let ((file-type (car (get sym 'val))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8632 (or (not (stringp file-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8633 (file-exists-p (efs-chase-symlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8634 (expand-file-name file-type efs-completion-dir))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8635
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8636 (defun efs-file-entry-not-ignored-p (sym)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8637 ;; If the file entry is not a directory (nor a symlink pointing to a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8638 ;; directory) returns whether the file (or file pointed to by the symlink)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8639 ;; is ignored by completion-ignored-extensions.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8640 (let ((file-type (car (get sym 'val)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8641 (symname (symbol-name sym)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8642 (if (stringp file-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8643 ;; Maybe file-truename would be better here, but it is very costly
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8644 ;; to chase symlinks at every level over FTP.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8645 (let ((file (efs-chase-symlinks (expand-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8646 file-type efs-completion-dir))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8647 (or (file-directory-p file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8648 (and (file-exists-p file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8649 (not (string-match efs-completion-ignored-pattern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8650 symname)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8651 (or file-type ; is a directory name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8652 (not (string-match efs-completion-ignored-pattern symname))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8653
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8654 (defun efs-file-name-all-completions (file dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8655 ;; Does file-name-all-completions in remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8656 (efs-barf-if-not-directory dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8657 (let* ((efs-completion-dir (file-name-as-directory (expand-file-name dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8658 (completion-ignore-case
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8659 (memq (efs-host-type (car (efs-ftp-path efs-completion-dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8660 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8661 (tbl (efs-get-files efs-completion-dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8662 (completions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8663 (all-completions file tbl
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8664 (function efs-file-entry-active-p))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8665 ;; see whether each matching file is a directory or not...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8666 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8667 ;; Since the entries in completions will match the case
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8668 ;; of the entries in tbl, don't need to case-fold
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8669 ;; in efs-get-hash-entry below.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8670 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8671 (lambda (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8672 (let ((ent (car (efs-get-hash-entry file tbl))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8673 (if (or (eq ent t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8674 (and (stringp ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8675 (file-directory-p (efs-chase-symlinks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8676 (expand-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8677 ent efs-completion-dir)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8678 (concat file "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8679 file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8680 completions)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8681
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8682 (defun efs-file-name-completion (file dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8683 ;; Does file name expansion in remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8684 (efs-barf-if-not-directory dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8685 (if (equal file "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8686 ""
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8687 (let* ((efs-completion-dir (file-name-as-directory (expand-file-name dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8688 (completion-ignore-case
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8689 (memq (efs-host-type (car (efs-ftp-path efs-completion-dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8690 efs-case-insensitive-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8691 (tbl (efs-get-files efs-completion-dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8692 (efs-set-completion-ignored-pattern)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8693 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8694 (or (efs-file-name-completion-1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8695 file tbl efs-completion-dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8696 (function efs-file-entry-not-ignored-p))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8697 (efs-file-name-completion-1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8698 file tbl efs-completion-dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8699 (function efs-file-entry-active-p)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8700
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8701 (defun efs-file-name-completion-1 (file tbl dir predicate)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8702 ;; Internal subroutine for efs-file-name-completion. Do not call this.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8703 (let ((bestmatch (try-completion file tbl predicate)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8704 (if bestmatch
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8705 (if (eq bestmatch t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8706 (if (file-directory-p (expand-file-name file dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8707 (concat file "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8708 t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8709 (if (and (eq (try-completion bestmatch tbl predicate) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8710 (file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8711 (expand-file-name bestmatch dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8712 (concat bestmatch "/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8713 bestmatch)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8714
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8715 ;;;; ----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8716 ;;;; Functions for loading lisp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8717 ;;;; ----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8718
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8719 ;;; jka-load provided ideas here. Thanks, Jay.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8720
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8721 (defun efs-load-openp (str suffixes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8722 ;; Given STR, searches load-path and efs-load-lisp-extensions
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8723 ;; for the name of a file to load. Returns the full path, or nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8724 ;; if none found.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8725 (let ((path-list (if (file-name-absolute-p str) t load-path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8726 root result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8727 ;; If there is no load-path, at least try the default directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8728 (or path-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8729 (setq path-list (list default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8730 (while (and path-list (null result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8731 (if (eq path-list t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8732 (setq path-list nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8733 root str)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8734 (setq root (expand-file-name str (car path-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8735 path-list (cdr path-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8736 (or (file-name-absolute-p root)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8737 (setq root (expand-file-name root default-directory))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8738 (let ((suff-list suffixes))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8739 (while (and suff-list (null result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8740 (let ((try (concat root (car suff-list))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8741 (if (or (not (file-readable-p try))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8742 (file-directory-p try))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8743 (setq suff-list (cdr suff-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8744 (setq result try))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8745 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8746
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8747 (defun efs-load (file &optional noerror nomessage nosuffix)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8748 "Documented as original."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8749 (let ((filename (efs-load-openp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8750 file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8751 (if nosuffix '("") efs-load-lisp-extensions))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8752 (if (not filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8753 (and (null noerror) (error "Cannot open load file %s" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8754 (let ((parsed (efs-ftp-path filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8755 (after-load (and (boundp 'after-load-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8756 (assoc file after-load-alist))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8757 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8758 (let ((temp (car (efs-make-tmp-name nil (car parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8759 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8760 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8761 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8762 filename parsed temp nil t nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8763 (format "Getting %s" filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8764 (or (file-readable-p temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8765 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8766 "efs-load: temp file %s is unreadable" temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8767 (or nomessage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8768 (message "Loading %s..." file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8769 ;; temp is an absolute filename, so load path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8770 ;; won't be searched.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8771 (let (after-load-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8772 (efs-real-load temp t t t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8773 (or nomessage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8774 (message "Loading %s...done" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8775 (if after-load (mapcar 'eval (cdr after-load)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8776 t) ; return t if everything worked
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8777 (efs-del-tmp-name temp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8778 (prog2
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8779 (or nomessage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8780 (message "Loading %s..." file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8781 (let (after-load-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8782 (or (efs-real-load filename noerror t t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8783 (setq after-load nil)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8784 (or nomessage
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8785 (message "Loading %s...done" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8786 (if after-load (mapcar 'eval (cdr after-load)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8787
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8788 (defun efs-require (feature &optional filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8789 "Documented as original."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8790 (if (eq feature 'ange-ftp) (efs-require-scream-and-yell))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8791 (if (featurep feature)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8792 feature
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8793 (or filename (setq filename (symbol-name feature)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8794 (let ((fullpath (efs-load-openp filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8795 efs-load-lisp-extensions)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8796 (if (not fullpath)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8797 (error "Cannot open load file: %s" filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8798 (let ((parsed (efs-ftp-path fullpath)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8799 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8800 (let ((temp (car (efs-make-tmp-name nil (car parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8801 (unwind-protect
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8802 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8803 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8804 fullpath parsed temp nil t nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8805 (format "Getting %s" fullpath))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8806 (or (file-readable-p temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8807 (error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8808 "efs-require: temp file %s is unreadable" temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8809 (efs-real-require feature temp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8810 (efs-del-tmp-name temp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8811 (efs-real-require feature fullpath)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8812
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8813 (defun efs-require-scream-and-yell ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8814 ;; Complain if something attempts to load ange-ftp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8815 (with-output-to-temp-buffer "*Help*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8816 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8817 "Something tried to load ange-ftp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8818 EFS AND ANGE-FTP DO NOT WORK TOGETHER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8819
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8820 If the culprit package does need to access ange-ftp internal functions,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8821 then it should be adequate to simply remove the \(require 'ange-ftp\)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8822 line and let efs handle remote file access. Otherwise, it will need to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8823 be ported to efs. This may already have been done, and you can find out
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8824 by sending an enquiry to efs-help@cuckoo.hpl.hp.com.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8825
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8826 Signalling an error with backtrace will allow you to determine which
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8827 package was requiring ange-ftp.\n"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8828 (select-window (get-buffer-window "*Help*"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8829 (enlarge-window (- (count-lines (point-min) (point-max))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8830 (window-height) -1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8831 (if (y-or-n-p "Signal error with backtrace? ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8832 (let ((stack-trace-on-error t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8833 (error "Attempt to require ange-ftp"))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8834
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8835 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8836 ;;;; Redefinition of Emacs functions for reading file names.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8837 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8838
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8839 (defun efs-unexpand-parsed-filename (host user path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8840 ;; Replaces the home directory in path with "~". Returns the unexpanded
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8841 ;; full-path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8842 (let* ((path-len (length path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8843 (def-user (efs-get-user host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8844 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8845 (ignore-case (memq host-type efs-case-insensitive-host-types)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8846 (if (> path-len 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8847 (let* ((home (efs-expand-tilde "~" host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8848 (home-len (length home)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8849 (if (and (> path-len home-len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8850 (if ignore-case (string-equal (downcase home)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8851 (downcase
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8852 (substring path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8853 0 home-len)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8854 (string-equal home (substring path 0 home-len)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8855 (= (aref path home-len) ?/))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8856 (setq path (concat "~" (substring path home-len))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8857 (if (if ignore-case (string-equal (downcase user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8858 (downcase def-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8859 (string-equal user def-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8860 (format efs-path-format-without-user host path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8861 (format efs-path-format-string user host path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8862
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8863 (efs-define-fun efs-abbreviate-file-name (filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8864 ;; Version of abbreviate-file-name for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8865 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8866 (let ((tail directory-abbrev-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8867 (while tail
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8868 (if (string-match (car (car tail)) filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8869 (setq filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8870 (concat (cdr (car tail))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8871 (substring filename (match-end 0)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8872 (setq tail (cdr tail)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8873 (apply 'efs-unexpand-parsed-filename (efs-ftp-path filename)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8874
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8875 (defun efs-default-dir-function ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8876 (let ((parsed (efs-ftp-path default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8877 (dd default-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8878 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8879 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8880 (let ((tail directory-abbrev-alist))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8881 (while tail
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8882 (if (string-match (car (car tail)) dd)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8883 (setq dd (concat (cdr (car tail))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8884 (substring dd (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8885 parsed nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8886 (setq tail (cdr tail)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8887 (apply 'efs-unexpand-parsed-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8888 (or parsed (efs-ftp-path dd)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8889 default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8890
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8891 (defun efs-re-read-dir (&optional dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8892 "Forces a re-read of the directory DIR.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8893 If DIR is omitted then it defaults to the directory part of the contents
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8894 of the current buffer. This is so this function can be caled from the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8895 minibuffer."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8896 (interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8897 (if dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8898 (setq dir (expand-file-name dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8899 (setq dir (file-name-directory (expand-file-name (buffer-string)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8900 (let ((parsed (efs-ftp-path dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8901 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8902 (let ((efs-ls-uncache t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8903 (efs-del-hash-entry (efs-canonize-file-name dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8904 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8905 (efs-get-files dir t)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8906
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8907 ;;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8908 ;;;; Creation and deletion of files and directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8909 ;;;; ---------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8910
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8911 (defun efs-delete-file (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8912 ;; Deletes remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8913 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8914 (parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8915 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8916 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8917 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8918 (path (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8919 (abbr (efs-relativize-filename file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8920 (result (efs-send-cmd host user (list 'delete path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8921 (format "Deleting %s" abbr))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8922 (if (car result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8923 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8924 (list "Removing old name"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8925 (format "FTP Error: \"%s\"" (nth 1 result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8926 file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8927 (efs-delete-file-entry host-type file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8928
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8929 (defun efs-make-directory-internal (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8930 ;; version of make-directory-internal for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8931 (if (file-exists-p dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8932 (error "Cannot make directory %s: file already exists" dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8933 (let* ((parsed (efs-ftp-path dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8934 (host (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8935 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8936 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8937 ;; Some ftp's on unix machines (at least on Suns)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8938 ;; insist that mkdir take a filename, and not a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8939 ;; directory-name name as an arg. Argh!! This is a bug.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8940 ;; Non-unix machines will probably always insist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8941 ;; that mkdir takes a directory-name as an arg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8942 ;; (as the ftp man page says it should).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8943 (path (if (or (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8944 (memq host-type '(os2 dos)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8945 (efs-internal-directory-file-name (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8946 (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8947 host-type (nth 2 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8948 (abbr (efs-relativize-filename dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8949 (result (efs-send-cmd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8950 (list 'mkdir path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8951 (format "Making directory %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8952 abbr))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8953 (if (car result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8954 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8955 (format "Could not make directory %s: %s" dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8956 (nth 1 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8957 (efs-add-file-entry host-type dir t nil user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8958
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8959 ;; V19 calls this function delete-directory. It used to be called
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8960 ;; remove-directory.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8961
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8962 (defun efs-delete-directory (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8963 ;; Version of delete-directory for remote directories.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8964 (if (file-directory-p dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8965 (let* ((parsed (efs-ftp-path dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8966 (host (nth 0 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8967 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8968 (host-type (efs-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8969 ;; Some ftp's on unix machines (at least on Suns)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8970 ;; insist that rmdir take a filename, and not a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8971 ;; directory-name name as an arg. Argh!! This is a bug.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8972 ;; Non-unix machines will probably always insist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8973 ;; that rmdir takes a directory-name as an arg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8974 ;; (as the ftp man page says it should).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8975 (path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8976 (if (or (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8977 (memq host-type '(os2 dos)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8978 (efs-internal-directory-file-name (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8979 (efs-internal-file-name-as-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8980 host-type (nth 2 parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8981 (abbr (efs-relativize-filename dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8982 (result (efs-send-cmd host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8983 (list 'rmdir path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8984 (format "Deleting directory %s" abbr))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8985 (if (car result)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8986 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8987 (format "Could not delete directory %s: %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8988 dir (nth 1 result))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8989 (efs-delete-file-entry host-type dir t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8990 (error "Not a directory: %s" dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8991
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8992 (defun efs-file-local-copy (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8993 ;; internal function for diff.el (dired 6.3 or later)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8994 ;; Makes a temp file containing the contents of file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8995 ;; returns the name of the tmp file created, or nil if none is.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8996 ;; This function should have optional cont and nowait args.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8997 (let* ((file (expand-file-name file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8998 (tmp (car (efs-make-tmp-name nil (car (efs-ftp-path file))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
8999 (efs-copy-file-internal file (efs-ftp-path file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9000 tmp nil t nil (format "Getting %s" file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9001 tmp))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9002
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9003 (defun efs-diff/grep-del-temp-file (temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9004 ;; internal function for diff.el and grep.el
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9005 ;; if TEMP is non-nil, deletes the temp file TEMP.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9006 ;; if TEMP is nil, does nothing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9007 (and temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9008 (efs-del-tmp-name temp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9009
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9010 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9011 ;;;; File copying support...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9012 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9013
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9014 ;;; - totally re-written 6/24/92.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9015 ;;; - re-written again 9/3/93
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9016 ;;; - and again 14/4/93
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9017 ;;; - and again 17/8/93
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9018
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9019 (defun efs-barf-or-query-if-file-exists (absname querystring interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9020 (if (file-exists-p absname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9021 (if (not interactive)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9022 (signal 'file-already-exists (list absname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9023 (if (not (yes-or-no-p (format "File %s already exists; %s anyway? "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9024 absname querystring)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9025 (signal 'file-already-exists (list absname))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9026
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9027 (defun efs-concatenate-files (file1 file2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9028 ;; Concatenates file1 to file2. Both must be local files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9029 ;; Needed because the efs version of copy-file understands
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9030 ;; ok-if-already-exists = 'append
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9031 (or (file-readable-p file1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9032 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9033 (list (format "Input file %s not readable." file1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9034 (or (file-writable-p file2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9035 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9036 (list (format "Output file %s not writable." file2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9037 (let ((default-directory exec-directory))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9038 (call-process "sh" nil nil nil "-c" (format "cat %s >> %s" file1 file2))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9039
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9040 (defun efs-copy-add-file-entry (newname host-type user size append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9041 ;; Add an entry in `efs-files-hashtable' for a file newly created via a copy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9042 (if (eq size -1) (setq size nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9043 (if append
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9044 (let ((ent (efs-get-file-entry newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9045 (if (and ent (null (car ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9046 (if (and size (numberp (nth 1 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9047 (setcar (cdr ent) (+ size (nth 1 ent)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9048 (setcar (cdr ent) nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9049 ;; If the ent is a symlink or directory, don't overwrite that entry.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9050 (if (null ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9051 (efs-add-file-entry host-type newname nil nil nil))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9052 (efs-add-file-entry host-type newname nil size user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9053
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9054 (defun efs-copy-remote-to-remote (f-host-type f-host f-user f-path filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9055 t-host-type t-host t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9056 t-path newname append msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9057 nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9058 ;; Use a 3rd data connection to copy from F-HOST for F-USER to T-HOST
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9059 ;; for T-USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9060 (if (efs-get-host-property t-host 'pasv-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9061 ;; PASV didn't work before, don't try again.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9062 (if cont (efs-call-cont cont 'failed "" ""))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9063 (or xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9064 (setq xfer-type (efs-xfer-type f-host-type filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9065 t-host-type newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9066 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9067 t-host t-user '(quote pasv) nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9068 (efs-cont (pasv-result pasv-line pasv-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9069 (cont nowait f-host-type f-host f-user f-path filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9070 t-host-type t-host t-user t-path newname xfer-type msg append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9071 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9072 (if (or pasv-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9073 (not (string-match efs-pasv-msgs pasv-line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9074 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9075 (efs-set-host-property t-host 'pasv-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9076 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9077 (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9078 cont (or pasv-result 'failed) pasv-line pasv-cont-lines)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9079 (let ((address (substring pasv-line (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9080 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9081 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9082 f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9083 (list 'quote 'port address) nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9084 (efs-cont (port-result port-line port-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9085 (cont f-host f-user f-host-type f-path filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9086 xfer-type msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9087 (if port-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9088 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9089 (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9090 cont port-result port-line port-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9091 (efs-error f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9092 (format "PORT failed for %s: %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9093 filename port-line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9094 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9095 f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9096 (list 'quote 'retr f-path xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9097 msg nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9098 (efs-cont (retr-result retr-line retr-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9099 (cont f-host f-user f-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9100 (and retr-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9101 (null cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9102 (efs-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9103 f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9104 (format "RETR failed for %s: %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9105 f-path retr-line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9106 (if cont (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9107 cont retr-result retr-line retr-cont-lines)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9108 (if (eq nowait t) 1 nowait))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9109 1) ; can't ever wait on this command.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9110 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9111 t-host t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9112 (list 'quote (if append 'appe 'stor) t-path xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9113 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9114 (efs-cont (stor-result stor-line stor-cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9115 (t-host t-user t-path t-host-type newname filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9116 append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9117 (if stor-result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9118 (efs-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9119 t-host t-user (format "%s failed for %s: %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9120 (if append "APPE" "STOR")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9121 t-path stor-line))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9122 (efs-copy-add-file-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9123 newname t-host-type t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9124 (nth 1 (efs-get-file-entry filename)) append)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9125 (if (eq nowait t) 1 nowait))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9126 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9127
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9128 (defun efs-copy-on-remote (host user host-type filename newname filename-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9129 newname-parsed keep-date append-p msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9130 nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9131 ;; Uses site exec to copy the file on a remote host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9132 (let ((exec-cp (efs-get-host-property host 'exec-cp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9133 (if (or append-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9134 (not (memq host-type efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9135 (efs-get-host-property host 'exec-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9136 (eq exec-cp 'failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9137 (efs-copy-via-temp filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9138 append-p keep-date msg cont nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9139 (if (eq exec-cp 'works)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9140 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9141 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9142 (list 'quote 'site 'exec
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9143 (format "cp %s%s %s" (if keep-date "-p " "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9144 (nth 2 filename-parsed) (nth 2 newname-parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9145 msg nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9146 (efs-cont (result line cont-lines) (host user filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9147 host-type filename-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9148 newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9149 keep-date append-p msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9150 xfer-type nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9151 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9152 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9153 (efs-set-host-property host 'exec-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9154 (efs-copy-via-temp filename filename-parsed newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9155 newname-parsed append-p keep-date
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9156 nil cont nowait xfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9157 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9158 (if (string-match "\n200-\\([^\n]*\\)" cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9159 (let ((err (substring cont-lines (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9160 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9161 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9162 (efs-call-cont cont 'failed err cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9163 (efs-error host user err)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9164 (efs-copy-add-file-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9165 newname host-type user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9166 (nth 7 (efs-file-attributes filename)) nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9167 (if cont (efs-call-cont cont nil line cont-lines))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9168 nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9169 (message "Checking for cp executable on %s..." host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9170 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9171 host user (list 'quote 'site 'exec "cp / /") nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9172 (efs-cont (result line cont-lines) (host user filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9173 host-type filename-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9174 newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9175 keep-date append-p msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9176 xfer-type nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9177 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9178 (if (string-match "\n200-" cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9179 (efs-set-host-property host 'exec-cp 'works)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9180 (efs-set-host-property host 'exec-cp 'failed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9181 (efs-copy-on-remote host user host-type filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9182 filename-parsed newname-parsed keep-date
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9183 append-p msg cont nowait xfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9184 nowait)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9185
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9186 (defun efs-copy-via-temp (filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9187 append keep-date msg cont nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9188 ;; Copies from FILENAME to NEWNAME via a temp file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9189 (let* ((temp (car (if (efs-use-gateway-p (car filename-parsed) t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9190 (efs-make-tmp-name (car filename-parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9191 (car newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9192 (efs-make-tmp-name (car newname-parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9193 (car filename-parsed)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9194 (temp-parsed (efs-ftp-path temp)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9195 (or xfer-type (setq xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9196 (efs-xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9197 (efs-host-type (car filename-parsed)) filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9198 (efs-host-type (car newname-parsed)) newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9199 t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9200 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9201 filename filename-parsed temp temp-parsed t nil (if (eq 0 msg) 2 msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9202 (efs-cont (result line cont-lines) (newname newname-parsed temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9203 temp-parsed append msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9204 nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9205 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9206 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9207 (efs-del-tmp-name temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9208 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9209 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9210 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9211 (list "Opening input file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9212 (format "FTP Error: \"%s\" " line) filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9213 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9214 temp temp-parsed newname newname-parsed (if append 'append t) nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9215 (if (eq msg 0) 1 msg)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9216 (efs-cont (result line cont-lines) (temp newname cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9217 (efs-del-tmp-name temp)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9218 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9219 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9220 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9221 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9222 (list "Opening output file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9223 (format "FTP Error: \"%s\" " line) newname)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9224 nowait xfer-type)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9225 nowait xfer-type)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9226
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9227 (defun efs-copy-file-internal (filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9228 ok-if-already-exists keep-date
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9229 &optional msg cont nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9230 ;; Internal function for copying a file from FILENAME to NEWNAME.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9231 ;; FILENAME-PARSED and NEWNAME-PARSED are the lists obtained by parsing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9232 ;; FILENAME and NEWNAME with efs-ftp-path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9233 ;; If OK-IF-ALREADY-EXISTS is nil, then existing files will not be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9234 ;; overwritten.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9235 ;; If it is a number, then the user will be prompted about overwriting.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9236 ;; If it eq 'append, then an existing file will be appended to.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9237 ;; If it has anyother value, then existing files will be silently
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9238 ;; overwritten.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9239 ;; If KEEP-DATE is t then we will attempt to reatin the date of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9240 ;; original copy of the file. If this is a string, the modtime of the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9241 ;; NEWNAME will be set to this date. Must be in touch -t format.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9242 ;; If MSG is nil, then the copying will be done silently.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9243 ;; If it is a string, then that will be the massage displayed while copying.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9244 ;; If it is 0, then a suitable default message will be computed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9245 ;; If it is 1, then a suitable default will be computed, assuming
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9246 ;; that FILENAME is a temporary file, whose name is not suitable to use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9247 ;; in a status message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9248 ;; If it is 2, then a suitable default will be used, assuming that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9249 ;; NEWNAME is a temporary file.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9250 ;; CONT is a continuation to call after completing the copy.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9251 ;; The first two args are RESULT and LINE, the result symbol and status
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9252 ;; line of the FTP command. If more than one ftp command has been used,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9253 ;; then these values for the last FTP command are given.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9254 ;; NOWAIT can be either nil, 0, 1, t. See `efs-send-cmd' for an explanation.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9255 ;; XFER-TYPE is the transfer type to use for transferring the files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9256 ;; If this is nil, than a suitable transfer type is computed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9257 ;; Does not call expand-file-name. Do that yourself.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9258
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9259 ;; check to see if we can overwrite
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9260 (if (or (not ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9261 (numberp ok-if-already-exists))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9262 (efs-barf-or-query-if-file-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9263 newname "copy to it" (numberp ok-if-already-exists)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9264 (if (null (or filename-parsed newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9265 ;; local to local copy
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9266 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9267 (if (eq ok-if-already-exists 'append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9268 (efs-concatenate-files filename newname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9269 (copy-file filename newname ok-if-already-exists keep-date))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9270 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9271 (efs-call-cont cont nil "Copied locally" "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9272 (let* ((f-host (car filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9273 (f-user (nth 1 filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9274 (f-path (nth 2 filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9275 (f-host-type (efs-host-type f-host f-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9276 (f-gate-p (efs-use-gateway-p f-host t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9277 (t-host (car newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9278 (t-user (nth 1 newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9279 (t-path (nth 2 newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9280 (t-host-type (efs-host-type t-host t-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9281 (t-gate-p (efs-use-gateway-p t-host t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9282 (append-p (eq ok-if-already-exists 'append))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9283 gatename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9284
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9285 (if (and (eq keep-date t) (null newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9286 ;; f-host must be remote now.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9287 (setq keep-date filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9288
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9289 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9290
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9291 ;; Check to see if we can do a PUT
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9292 ((or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9293 (and (null f-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9294 (or (null t-gate-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9295 (setq gatename (efs-local-to-gateway-filename filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9296 (and t-gate-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9297 f-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9298 (string-equal (downcase f-host) (downcase efs-gateway-host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9299 (if (memq f-host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9300 (string-equal (downcase f-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9301 (downcase (efs-get-user efs-gateway-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9302 (string-equal f-user (efs-get-user efs-gateway-host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9303 (or f-host (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9304 (if (file-exists-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9305 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9306 ((file-directory-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9307 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9308 (list "Non-regular file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9309 "is a directory" filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9310 ((not (file-readable-p filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9311 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9312 (list "Opening input file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9313 "permission denied" filename))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9314 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9315 (list "Opening input file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9316 "no such file or directory" filename)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9317 (or xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9318 (setq xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9319 (efs-xfer-type f-host-type filename t-host-type newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9320 (let ((size (and (or (null f-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9321 (efs-file-entry-p filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9322 (nth 7 (file-attributes filename)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9323 ;; -1 is a bogus size for remote files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9324 (if (eq size -1) (setq size nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9325 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9326 t-host t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9327 (list (if append-p 'append 'put)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9328 (if f-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9329 f-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9330 (or gatename filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9331 t-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9332 xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9333 (cond ((eq msg 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9334 (concat (if append-p "Appending " "Putting ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9335 (efs-relativize-filename filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9336 ((eq msg 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9337 (concat (if append-p "Appending " "Putting ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9338 (efs-relativize-filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9339 ((eq msg 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9340 (concat (if append-p "Appending " "Copying ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9341 (efs-relativize-filename filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9342 " to "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9343 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9344 newname (file-name-directory filename) filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9345 (t msg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9346 (and size (list 'efs-set-xfer-size t-host t-user size))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9347 (efs-cont (result line cont-lines) (newname t-host-type t-user size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9348 append-p cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9349 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9350 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9351 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9352 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9353 (list "Opening output file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9354 (format "FTP Error: \"%s\" " line) newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9355 ;; add file entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9356 (efs-copy-add-file-entry newname t-host-type t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9357 size append-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9358 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9359 (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9360 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9361
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9362 ;; Check to see if we can do a GET
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9363 ((and
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9364 ;; I think that giving the append arg, will cause this function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9365 ;; to make a temp file, recursively call itself, and append the temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9366 ;; file to the local file. Hope it works out...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9367 (null append-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9368 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9369 (and (null t-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9370 (or (null f-gate-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9371 (setq gatename (efs-local-to-gateway-filename newname))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9372 (and f-gate-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9373 t-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9374 (string-equal (downcase t-host) (downcase efs-gateway-host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9375 (if (memq t-host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9376 (string-equal (downcase t-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9377 (downcase (efs-get-user efs-gateway-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9378 (string-equal t-user (efs-get-user efs-gateway-host))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9379 (or t-host (let (file-name-handler-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9380 (cond ((not (file-writable-p newname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9381 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9382 (list "Opening output file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9383 "permission denied" newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9384 ((file-directory-p newname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9385 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9386 (list "Opening output file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9387 "is a directory" newname))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9388 (or xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9389 (setq xfer-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9390 (efs-xfer-type f-host-type filename t-host-type newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9391 (let ((size (and (or (null f-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9392 (efs-file-entry-p filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9393 (nth 7 (file-attributes filename)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9394 ;; -1 is a bogus size for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9395 (if (eq size -1) (setq size nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9396 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9397 f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9398 (list 'get
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9399 f-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9400 (if t-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9401 t-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9402 (or gatename newname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9403 xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9404 (cond ((eq msg 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9405 (concat "Copying "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9406 (efs-relativize-filename filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9407 " to "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9408 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9409 newname (file-name-directory filename) filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9410 ((eq msg 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9411 (concat "Getting " (efs-relativize-filename filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9412 ((eq msg 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9413 (concat "Getting " (efs-relativize-filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9414 (t msg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9415 ;; If the server emits a efs-xfer-size-msgs, it will over-ride this.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9416 ;; With no xfer msg, this is will do the job.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9417 (and size (list 'efs-set-xfer-size f-host f-user size))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9418 (efs-cont (result line cont-lines) (filename newname size
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9419 t-host-type t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9420 cont keep-date)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9421 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9422 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9423 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9424 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9425 (list "Opening input file"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9426 (format "FTP Error: \"%s\" " line) filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9427 ;; Add a new file entry, if relevant.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9428 (if t-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9429 ;; t-host will be equal to efs-gateway-host, if t-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9430 ;; is non-nil.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9431 (efs-copy-add-file-entry newname t-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9432 t-user size nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9433 (if (and (null t-host-type) (stringp keep-date))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9434 (efs-set-mdtm-of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9435 filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9436 (and cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9437 (efs-cont (result1 line1 cont-lines1) (result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9438 line cont-lines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9439 cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9440 (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9441 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9442 (efs-call-cont cont result line cont-lines)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9443 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9444
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9445 ;; Can we do a EXEC cp?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9446 ((and t-host f-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9447 (string-equal (downcase t-host) (downcase f-host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9448 (if (memq t-host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9449 (string-equal (downcase t-user) (downcase f-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9450 (string-equal t-user f-user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9451 (efs-copy-on-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9452 t-host t-user t-host-type filename newname filename-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9453 newname-parsed keep-date append-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9454 (cond ((eq msg 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9455 (concat "Copying "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9456 (efs-relativize-filename filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9457 " to "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9458 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9459 newname (file-name-directory filename) filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9460 ((eq msg 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9461 (concat "Copying " (efs-relativize-filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9462 ((eq msg 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9463 (concat "Copying " (efs-relativize-filename filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9464 (t msg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9465 cont nowait xfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9466
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9467 ;; Try for a copy with PASV
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9468 ((and t-host f-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9469 (not (and (string-equal (downcase t-host) (downcase f-host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9470 (if (memq t-host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9471 (string-equal (downcase t-user) (downcase f-user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9472 (string-equal t-user f-user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9473 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9474 (and efs-gateway-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9475 ;; The gateway should be able to talk to anything.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9476 (let ((gh (downcase efs-gateway-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9477 (or (string-equal (downcase t-host) gh)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9478 (string-equal (downcase f-host) gh))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9479 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9480 (eq (null (string-match efs-local-host-regexp t-host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9481 (null (string-match efs-local-host-regexp f-host))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9482 (efs-copy-remote-to-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9483 f-host-type f-host f-user f-path filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9484 t-host-type t-host t-user t-path newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9485 append-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9486 (cond ((eq msg 0)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9487 (concat "Copying "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9488 (efs-relativize-filename filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9489 " to "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9490 (efs-relativize-filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9491 newname (file-name-directory filename) filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9492 ((eq msg 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9493 (concat "Copying " (efs-relativize-filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9494 ((eq msg 2)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9495 (concat "Copying " (efs-relativize-filename filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9496 (t msg))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9497 (efs-cont (result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9498 (filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9499 append-p keep-date msg cont nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9500 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9501 ;; PASV didn't work. Do things the old-fashioned
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9502 ;; way.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9503 (efs-copy-via-temp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9504 filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9505 append-p keep-date msg cont nowait xfer-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9506 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9507 (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9508 nowait xfer-type))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9509
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9510 ;; Can't do anything direct. Divide and conquer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9511 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9512 (efs-copy-via-temp filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9513 append-p keep-date msg cont nowait xfer-type))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9514
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9515 (defun efs-copy-file (filename newname &optional ok-if-already-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9516 keep-date nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9517 ;; Version of copy file for remote files. Actually, will also work
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9518 ;; for local files too, since efs-copy-file-internal can copy anything.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9519 ;; If called interactively, copies asynchronously.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9520 (setq filename (expand-file-name filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9521 newname (expand-file-name newname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9522 (if (eq ok-if-already-exists 'append)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9523 (setq ok-if-already-exists t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9524 (efs-copy-file-internal filename (efs-ftp-path filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9525 newname (efs-ftp-path newname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9526 ok-if-already-exists keep-date 0 nil nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9527
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9528 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9529 ;;;; File renaming support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9530 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9531
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9532 (defun efs-rename-get-file-list (dir ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9533 ;; From hashtable ENT for DIR returns a list of all files except "."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9534 ;; and "..".
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9535 (let (list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9536 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9537 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9538 (lambda (key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9539 (or (string-equal "." key) (string-equal ".." key)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9540 (setq list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9541 (cons (expand-file-name key dir) list)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9542 ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9543 list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9544
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9545 (defun efs-rename-get-files (dir cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9546 ;; Obtains a list of files in directory DIR (except . and ..), and applies
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9547 ;; CONT to the list. Doesn't return anything useful.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9548 (let* ((dir (file-name-as-directory dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9549 (ent (efs-get-files-hashtable-entry dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9550 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9551 (efs-call-cont cont (efs-rename-get-file-list dir ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9552 (efs-ls
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9553 dir (efs-ls-guess-switches) t nil t nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9554 (efs-cont (listing) (dir cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9555 (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9556 cont (and listing
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9557 (efs-rename-get-file-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9558 dir (efs-get-files-hashtable-entry dir)))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9559
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9560 (defun efs-rename-get-local-file-tree (dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9561 ;; Returns a list of the full directory tree under DIR, for DIR on the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9562 ;; local host. The list is in tree order.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9563 (let ((res (list dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9564 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9565 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9566 (lambda (file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9567 (if (file-directory-p file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9568 (nconc res (delq nil (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9569 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9570 (lambda (f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9571 (and (not (string-equal "." f))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9572 (not (string-equal ".." f))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9573 (expand-file-name f file))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9574 (directory-files file)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9575 res)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9576 res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9577
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9578 (defun efs-rename-get-remote-file-tree (next curr total cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9579 ;; Builds a hierarchy of files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9580 ;; NEXT is the next level so far.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9581 ;; CURR are unprocessed files in the current level.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9582 ;; TOTAL is the processed files so far.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9583 ;; CONT is a cont. function called on the total list after all files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9584 ;; are processed.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9585 ;; NOWAIT non-nil means run asynch.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9586 (or curr (setq curr next
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9587 next nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9588 (if curr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9589 (let ((file (car curr)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9590 (setq curr (cdr curr)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9591 total (cons file total))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9592 (if (file-directory-p file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9593 (efs-rename-get-files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9594 file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9595 (efs-cont (list) (next curr total cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9596 (efs-rename-get-remote-file-tree (nconc next list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9597 curr total cont nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9598 nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9599 (efs-rename-get-remote-file-tree next curr total cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9600 (efs-call-cont cont (nreverse total))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9601
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9602 (defun efs-rename-make-targets (files from-dir-len to-dir host user host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9603 cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9604 ;; Make targets (copy a file or make a subdir) on local or host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9605 ;; for the files in list. Afterwhich, call CONT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9606 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9607 (let* ((from (car files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9608 (files (cdr files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9609 (to (concat to-dir (substring from from-dir-len))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9610 (if (file-directory-p from)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9611 (if host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9612 (let ((dir (nth 2 (efs-ftp-path to))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9613 (or (memq host-type efs-unix-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9614 (memq host-type '(dos os2))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9615 (setq dir (efs-internal-file-name-as-directory nil dir)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9616 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9617 host user (list 'mkdir dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9618 (format "Making directory %s" (efs-relativize-filename to))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9619 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9620 (efs-cont (res line cont-lines) (to files from-dir-len
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9621 to-dir host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9622 host-type cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9623 (if res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9624 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9625 (efs-call-cont cont res line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9626 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9627 (list "Making directory"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9628 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9629 to)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9630 (efs-rename-make-targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9631 files from-dir-len to-dir host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9632 host-type cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9633 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9634 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9635 (make-directory-internal to)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9636 (error (efs-call-cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9637 cont 'failed (format "Failed to mkdir %s" to) "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9638 (efs-rename-make-targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9639 files from-dir-len to-dir host user host-type cont nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9640 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9641 from (efs-ftp-path from) to (and host-type (efs-ftp-path to)) nil t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9642 (format "Renaming %s to %s" (efs-relativize-filename from)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9643 (efs-relativize-filename to))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9644 (efs-cont (res line cont-lines) (from to files from-dir-len to-dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9645 host user host-type cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9646 nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9647 (if res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9648 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9649 (efs-call-cont cont res line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9650 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9651 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9652 (format "FTP Error: \"%s\"" line) from to)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9653 (efs-rename-make-targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9654 files from-dir-len to-dir host user host-type cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9655 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9656 (if cont (efs-call-cont cont nil "" ""))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9657
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9658 (defun efs-rename-delete-on-local (files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9659 ;; Delete the files FILES, and then run CONT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9660 ;; FILES are assumed to be in inverse tree order.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9661 (message "Deleting files...")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9662 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9663 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9664 (lambda (f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9665 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9666 (if (file-directory-p f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9667 (delete-directory f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9668 (delete-file f))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9669 (file-error nil)))) ; don't complain if the file is already gone.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9670 files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9671 (message "Deleting files...done"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9672
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9673 (defun efs-rename-delete-on-remote (files host user host-type cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9674 ;; Deletes the list FILES on a remote host. When done calls CONT.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9675 ;; FILES is assumed to be in reverse tree order.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9676 (if files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9677 (let* ((f (car files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9678 (rf (nth 2 (efs-ftp-path f))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9679 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9680 (setq files (cdr files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9681 (if (file-directory-p f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9682 (let ((rf (if (memq host-type (append efs-unix-host-types
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9683 '(dos os2)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9684 (efs-internal-directory-file-name f)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9685 (efs-internal-file-name-as-directory nil f))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9686
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9687 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9688 host user (list 'rmdir rf)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9689 (concat "Deleting directory " (efs-relativize-filename f))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9690 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9691 (efs-cont (res line cont-lines) (f files host user host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9692 cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9693 (if (and res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9694 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9695 (not (string-match "^550 " line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9696 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9697 (efs-call-cont cont res line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9698 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9699 (list "Deleting directory"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9700 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9701 f)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9702 (efs-rename-delete-on-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9703 files host user host-type cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9704 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9705 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9706 host user (list 'delete rf)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9707 (concat "Deleting " rf)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9708 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9709 (efs-cont (res line cont-lines) (f files host user host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9710 cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9711 (if (and res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9712 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9713 (not (string-match "^550 " line))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9714 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9715 (efs-call-cont cont res line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9716 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9717 (list "Deleting"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9718 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9719 f)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9720 (efs-rename-delete-on-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9721 files host user host-type cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9722 nowait))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9723 (if cont (efs-call-cont cont nil "" ""))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9724
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9725 (defun efs-rename-on-remote (host user old-path new-path old-file new-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9726 msg nowait cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9727 ;; Run a rename command on the remote server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9728 ;; OLD-PATH and NEW-PATH are in full efs syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9729 ;; OLD-FILE and NEW-FILE are the remote full pathnames, not in efs syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9730 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9731 host user (list 'rename old-file new-file) msg nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9732 (efs-cont (result line cont-lines) (cont old-path new-path host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9733 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9734 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9735 (or (and (>= (length line) 4)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9736 (string-equal "550 " (substring line 0 4)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9737 (efs-set-host-property host 'rnfr-failed t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9738 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9739 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9740 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9741 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9742 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9743 old-path new-path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9744 (let ((entry (efs-get-file-entry old-path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9745 (host-type (efs-host-type host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9746 ;; If no file entry, do extra work on the hashtable,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9747 ;; rather than force a listing.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9748 (dir-p (or (not (efs-file-entry-p old-path))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9749 (file-directory-p old-path))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9750 (apply 'efs-add-file-entry host-type new-path
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9751 (eq (car entry) t) (cdr entry))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9752 (efs-delete-file-entry host-type old-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9753 (if dir-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9754 (let* ((old (efs-canonize-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9755 (file-name-as-directory old-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9756 (new (efs-canonize-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9757 (file-name-as-directory new-path)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9758 (old-len (length old))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9759 (new-tbl (efs-make-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9760 (length efs-files-hashtable))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9761 (efs-map-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9762 (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9763 (lambda (key val)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9764 (if (and (>= (length key) old-len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9765 (string-equal (substring key 0 old-len)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9766 old))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9767 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9768 (concat new (substring key old-len)) val new-tbl)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9769 (efs-put-hash-entry key val new-tbl))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9770 efs-files-hashtable)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9771 (setq efs-files-hashtable new-tbl)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9772 (if cont (efs-call-cont cont result line cont-lines)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9773 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9774
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9775 (defun efs-rename-local-to-remote (filename newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9776 msg cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9777 ;; Renames a file from the local host to a remote host.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9778 (if (file-directory-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9779 (let* ((files (efs-rename-get-local-file-tree filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9780 (to-dir (directory-file-name newname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9781 (filename (directory-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9782 (len (length filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9783 (t-parsed (efs-ftp-path to-dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9784 (host (car t-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9785 (user (nth 1 t-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9786 (host-type (efs-host-type host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9787 ;; MSG is never passed here, instead messages are constructed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9788 ;; internally. I don't know how to use a single message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9789 ;; in a function which sends so many FTP commands.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9790 (efs-rename-make-targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9791 files len to-dir host user host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9792 (efs-cont (result line cont-lines) (files filename newname cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9793 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9794 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9795 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9796 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9797 (list "Renaming" (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9798 filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9799 (efs-rename-delete-on-local (nreverse files))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9800 (if cont (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9801 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9802 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9803 filename nil newname newname-parsed t t msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9804 (efs-cont (result line cont-lines) (filename cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9805 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9806 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9807 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9808 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9809 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9810 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9811 filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9812 (condition-case nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9813 (delete-file filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9814 (error nil))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9815 (if cont (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9816 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9817
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9818 (defun efs-rename-from-remote (filename filename-parsed newname newname-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9819 msg cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9820 (let ((f-host (car filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9821 (f-user (nth 1 filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9822 (fast-nowait (if (eq nowait t) 1 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9823 (if (file-directory-p filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9824 (let* ((t-host (car newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9825 (t-user (nth 1 newname-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9826 (t-host-type (and t-host (efs-host-type t-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9827 (f-host-type (efs-host-type f-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9828 (efs-rename-get-remote-file-tree
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9829 nil (list filename) nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9830 (efs-cont (list) (filename filename-parsed newname t-host t-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9831 t-host-type f-host f-user f-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9832 cont fast-nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9833 (efs-rename-make-targets
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9834 list (length filename) newname t-host t-user t-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9835 (efs-cont (res line cont-lines) (filename newname f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9836 f-host-type list cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9837 fast-nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9838 (if res
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9839 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9840 (efs-call-cont cont res line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9841 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9842 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9843 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9844 filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9845 (efs-rename-delete-on-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9846 (nreverse list) f-host f-user f-host-type cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9847 fast-nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9848 fast-nowait)) nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9849 ;; Do things the simple way.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9850 (let ((f-path (nth 2 filename-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9851 (f-abbr (efs-relativize-filename filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9852 (efs-copy-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9853 filename filename-parsed newname newname-parsed t t msg
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9854 (efs-cont (result line cont-lines) (filename newname f-host f-user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9855 f-path f-abbr
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9856 cont fast-nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9857 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9858 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9859 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9860 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9861 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9862 (format "FTP Error: \"%s\"" line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9863 filename newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9864 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9865 f-host f-user (list 'delete f-path)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9866 (format "Removing %s" f-abbr) nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9867 (efs-cont (result line cont-lines) (filename f-host cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9868 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9869 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9870 (efs-call-cont cont result line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9871 (signal 'ftp-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9872 (list "Renaming"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9873 (format "Failed to remove %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9874 filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9875 "FTP Error: \"%s\"" line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9876 (efs-delete-file-entry (efs-host-type f-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9877 filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9878 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9879 (efs-call-cont cont result line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9880 fast-nowait))) nowait)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9881
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9882 (defun efs-rename-file-internal (filename newname ok-if-already-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9883 &optional msg cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9884 ;; Internal version of rename-file for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9885 ;; Takes CONT and NOWAIT args.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9886 (let ((filename (expand-file-name filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9887 (newname (expand-file-name newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9888 (let ((f-parsed (efs-ftp-path filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9889 (t-parsed (efs-ftp-path newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9890 (if (null (or f-parsed t-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9891 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9892 ;; local rename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9893 (rename-file filename newname ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9894 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9895 (efs-call-cont cont nil "Renamed locally" "")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9896
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9897 ;; check to see if we can overwrite
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9898 (if (or (not ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9899 (numberp ok-if-already-exists))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9900 (efs-barf-or-query-if-file-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9901 newname "rename to it" (numberp ok-if-already-exists)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9902
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9903 (let ((f-abbr (efs-relativize-filename filename))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9904 (t-abbr (efs-relativize-filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9905 (file-name-directory filename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9906 filename)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9907 (or msg (setq msg (format "Renaming %s to %s" f-abbr t-abbr)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9908 (if f-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9909 (let* ((f-host (car f-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9910 (f-user (nth 1 f-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9911 (f-path (nth 2 f-parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9912 (f-host-type (efs-host-type f-host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9913 (if (and t-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9914 (string-equal (downcase f-host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9915 (downcase (car t-parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9916 (not (efs-get-host-property f-host 'rnfr-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9917 (if (memq f-host-type efs-case-insensitive-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9918 (string-equal (downcase f-user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9919 (downcase (nth 1 t-parsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9920 (string-equal f-user (nth 1 t-parsed))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9921 ;; Can run a RENAME command on the server.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9922 (efs-rename-on-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9923 f-host f-user filename newname f-path (nth 2 t-parsed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9924 msg nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9925 (efs-cont (result line cont-lines) (f-host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9926 filename
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9927 newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9928 ok-if-already-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9929 msg cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9930 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9931 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9932 (efs-set-host-property f-host 'rnfr-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9933 (efs-rename-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9934 filename newname ok-if-already-exists msg cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9935 (if (eq nowait t) 1 nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9936 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9937 (efs-call-cont cont result line cont-lines)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9938 ;; remote to remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9939 (efs-rename-from-remote filename f-parsed newname t-parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9940 msg cont nowait)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9941 ;; local to remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9942 (efs-rename-local-to-remote
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9943 filename newname t-parsed msg cont nowait)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9944
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9945 (defun efs-rename-file (filename newname &optional ok-if-already-exists nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9946 ;; Does file renaming for remote files.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9947 (efs-rename-file-internal filename newname ok-if-already-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9948 nil nil nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9949
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9950 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9951 ;;;; Making symbolic and hard links.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9952 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9953
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9954 ;;; These functions require that the remote FTP server understand
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9955 ;;; SITE EXEC and that ln is in its the ftp-exec path.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9956
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9957 (defun efs-try-ln (host user cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9958 ;; Do some preemptive testing to see if exec ln works
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9959 (if (efs-get-host-property host 'exec-failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9960 (signal 'ftp-error (list "Unable to exec ln on host" host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9961 (let ((exec-ln (efs-get-host-property host 'exec-ln)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9962 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9963 ((eq exec-ln 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9964 (signal 'ftp-error (list "ln is not in FTP exec path on host" host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9965 ((eq exec-ln 'works)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9966 (efs-call-cont cont))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9967 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9968 (message "Checking for ln executable on %s..." host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9969 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9970 host user '(quote site exec "ln / /")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9971 nil nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9972 (efs-cont (result line cont-lines) (host user cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9973 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9974 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9975 (efs-set-host-property host 'exec-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9976 (efs-error host user (format "exec: %s" line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9977 ;; Look for an error message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9978 (if (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9979 (string-match "\n200-" cont-lines))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9980 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9981 (efs-set-host-property host 'exec-ln 'works)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9982 (efs-call-cont cont))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9983 (efs-set-host-property host 'exec-ln 'failed)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9984 (efs-error host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9985 (format "ln not in FTP exec path on host %s" host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9986 nowait)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9987
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9988 (defun efs-make-symbolic-link-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9989 (target linkname &optional ok-if-already-exists cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9990 ;; Makes remote symbolic links. Assumes that linkname is already expanded.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9991 (let* ((parsed (efs-ftp-path linkname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9992 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9993 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9994 (linkpath (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9995 (abbr (efs-relativize-filename linkname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9996 (file-name-directory target) target))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9997 (tparsed (efs-ftp-path target))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9998 (com-target target)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
9999 cmd-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10000 (if (null (file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10001 (file-name-directory linkname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10002 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10003 (efs-call-cont cont 'failed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10004 (format "no such file or directory, %s" linkname)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10005 "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10006 (signal 'file-error (list "no such file or directory" linkname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10007 (if (or (not ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10008 (numberp ok-if-already-exists))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10009 (efs-barf-or-query-if-file-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10010 linkname "make symbolic link" (numberp ok-if-already-exists)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10011 ;; Do this after above, so that hopefully the host type is sorted out
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10012 ;; by now.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10013 (let ((host-type (efs-host-type host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10014 (if (or (not (memq host-type efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10015 (memq host-type efs-dumb-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10016 (efs-get-host-property host 'exec-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10017 (error "Unable to make symbolic links on %s." host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10018 ;; Be careful not to spoil relative links, or symlinks to other
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10019 ;; machines, which maybe symlink-fix.el can sort out.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10020 (if (and tparsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10021 (string-equal (downcase (car tparsed)) (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10022 (string-equal (nth 1 tparsed) user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10023 (setq com-target (nth 2 tparsed)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10024 ;; symlinks only work for unix, so don't need to
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10025 ;; convert pathnames. What about VOS?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10026 (setq cmd-string (concat "ln -sf " com-target " " linkpath))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10027 (efs-try-ln
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10028 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10029 (efs-cont () (host user cmd-string target linkname com-target
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10030 abbr cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10031 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10032 host user (list 'quote 'site 'exec cmd-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10033 (format "Symlinking %s to %s" target abbr)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10034 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10035 (efs-cont (result line cont-lines) (host user com-target linkname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10036 cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10037 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10038 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10039 (efs-set-host-property host 'exec-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10040 (efs-error host user (format "exec: %s" line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10041 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10042 (if (string-match "\n200-\\([^\n]*\\)" cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10043 (let ((err (substring cont-lines (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10044 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10045 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10046 (efs-call-cont cont 'failed err cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10047 (efs-error host user err)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10048 (efs-add-file-entry nil linkname com-target nil user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10049 (if cont (efs-call-cont cont nil line cont-lines))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10050 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10051 nowait))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10052
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10053 (defun efs-make-symbolic-link (target linkname &optional ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10054 ;; efs version of make-symbolic-link
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10055 (let* ((linkname (expand-file-name linkname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10056 (parsed (efs-ftp-path linkname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10057 (if parsed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10058 (efs-make-symbolic-link-internal target linkname ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10059 ;; Handler will match on either target or linkname. We are only
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10060 ;; interested in the linkname.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10061 (let ((file-name-handler-alist (efs-file-name-handler-alist-sans-fn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10062 'efs-file-handler-function)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10063 (make-symbolic-link target linkname ok-if-already-exists)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10064
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10065 (defun efs-add-name-to-file-internal
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10066 (file newname &optional ok-if-already-exists cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10067 ;; Makes remote symbolic links. Assumes that linkname is already expanded.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10068 (let* ((parsed (efs-ftp-path file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10069 (host (car parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10070 (user (nth 1 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10071 (path (nth 2 parsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10072 (nparsed (efs-ftp-path newname))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10073 (nhost (car nparsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10074 (nuser (nth 1 nparsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10075 (npath (nth 2 nparsed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10076 (abbr (efs-relativize-filename newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10077 (file-name-directory file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10078 (ent (efs-get-file-entry file))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10079 cmd-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10080 (or (and (string-equal (downcase host) (downcase nhost))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10081 (string-equal user nuser))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10082 (error "Cannot create hard links between different host user pairs."))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10083 (if (or (null ent) (stringp (car ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10084 (not (file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10085 (file-name-directory newname))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10086 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10087 (efs-call-cont cont 'failed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10088 (format "no such file or directory, %s %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10089 file newname) "")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10090 (signal 'file-error
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10091 (list "no such file or directory"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10092 file newname)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10093 (if (or (not ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10094 (numberp ok-if-already-exists))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10095 (efs-barf-or-query-if-file-exists
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10096 newname "make hard link" (numberp ok-if-already-exists)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10097 ;; Do this last, so that hopefully the host type is known.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10098 (let ((host-type (efs-host-type host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10099 (if (or (not (memq host-type efs-unix-host-types))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10100 (memq host-type efs-dumb-host-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10101 (efs-get-host-property host 'exec-failed))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10102 (error "Unable to make hard links on %s." host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10103 (setq cmd-string (concat "ln -f " path " " npath))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10104 (efs-try-ln
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10105 host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10106 (efs-cont () (host user cmd-string file newname abbr cont nowait)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10107 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10108 host user (list 'quote 'site 'exec cmd-string)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10109 (format "Adding to %s name %s" file abbr)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10110 nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10111 (efs-cont (result line cont-lines) (host user file newname cont)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10112 (if result
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10113 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10114 (efs-set-host-property host 'exec-failed t)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10115 (efs-error host user (format "exec: %s" line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10116 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10117 (if (string-match "\n200-\\([^\n]*\\)" cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10118 (let ((err (substring cont-lines (match-beginning 1)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10119 (match-end 1))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10120 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10121 (efs-call-cont cont 'failed err cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10122 (efs-error host user err)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10123 (let ((ent (efs-get-file-entry file)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10124 (if ent
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10125 (let ((nlinks (nthcdr 4 ent))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10126 new-nlinks)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10127 (and (integerp (car nlinks))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10128 (setq new-nlinks (1+ (car nlinks)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10129 (setcar nlinks new-nlinks))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10130 (apply 'efs-add-file-entry nil newname ent)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10131 (if cont (efs-call-cont cont nil line cont-lines)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10132 (let ((tbl (efs-get-files-hashtable-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10133 (file-name-directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10134 (directory-file-name newname)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10135 (if tbl
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10136 (efs-ls
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10137 newname
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10138 (concat (efs-ls-guess-switches) "d") t t nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10139 nowait
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10140 (efs-cont (listing) (newname cont line cont-lines)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10141 (efs-update-file-info
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10142 newname efs-data-buffer-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10143 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10144 (efs-call-cont cont nil line cont-lines))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10145 (if cont
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10146 (efs-call-cont cont nil line cont-lines))))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10147 nowait))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10148 nowait))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10149
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10150 (defun efs-add-name-to-file (file newname &optional ok-if-already-exists)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10151 ;; efs version of add-name-to-file
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10152 (efs-add-name-to-file-internal file newname ok-if-already-exists))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10153
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10154
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10155 ;;;; ==============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10156 ;;;; >9
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10157 ;;;; Multiple Host Type Support.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10158 ;;;; The initial host type guessing is done in the PWD code below.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10159 ;;;; If necessary, further guessing is done in the listing parser.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10160 ;;;; ==============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10161
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10162
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10163 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10164 ;;;; Functions for setting and retrieving host types.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10165 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10166
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10167 (defun efs-add-host (type host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10168 "Sets the TYPE of the remote host HOST.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10169 The host type is read with completion so this can be used to obtain a
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10170 list of supported host types. HOST must be a string, giving the name of
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10171 the host, exactly as given in file names. Setting the host type with
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10172 this function is preferable to setting the efs-TYPE-host-regexp, as look up
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10173 will be faster. Returns TYPE."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10174 ;; Since internet host names are always case-insensitive, we will cache
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10175 ;; them in lower case.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10176 (interactive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10177 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10178 (intern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10179 (completing-read "Host type: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10180 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10181 (function (lambda (elt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10182 (list (symbol-name (car elt)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10183 efs-host-type-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10184 nil t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10185 (read-string "Host: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10186 (let ((name (or (buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10187 (and (eq major-mode 'dired-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10188 dired-directory))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10189 (and name (car (efs-ftp-path name)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10190 (setq host (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10191 (efs-set-host-property host 'host-type type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10192 (prog1
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10193 (setq efs-host-cache host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10194 efs-host-type-cache type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10195 (efs-set-process-host-type host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10196
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10197 (defun efs-set-process-host-type (host &optional user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10198 ;; Sets the value of efs-process-host-type so that it is shown
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10199 ;; on the mode-line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10200 (let ((buff-list (buffer-list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10201 (save-excursion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10202 (while buff-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10203 (set-buffer (car buff-list))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10204 (if (equal efs-process-host host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10205 (setq efs-process-host-type (concat " " (symbol-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10206 (efs-host-type host))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10207 (and efs-show-host-type-in-dired
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10208 (eq major-mode 'dired-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10209 efs-dired-host-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10210 (string-equal (downcase
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10211 (car (efs-ftp-path default-directory)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10212 (downcase host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10213 (if user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10214 (setq efs-dired-listing-type-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10215 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10216 " "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10217 (symbol-name (efs-listing-type host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10218 (or efs-dired-listing-type-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10219 (setq efs-dired-listing-type-string
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10220 (concat " " (symbol-name (efs-host-type host))))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10221 (setq buff-list (cdr buff-list))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10222
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10223 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10224 ;;;; Functions for setting and retrieving listings types.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10225 ;;;; ----------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10226
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10227 ;;; listing types??
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10228 ;;; These are distinguished from host types, in case some OS's have two
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10229 ;;; breeds of listings. e.g. Unix descriptive listings.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10230 ;;; We also use this to support the myriad of DOS ftp servers.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10231
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10232
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10233 (defun efs-listing-type (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10234 "Returns the type of listing used on HOST by USER.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10235 If there is no entry for a specialized listing, returns the host type."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10236 (or
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10237 (efs-get-host-user-property host user 'listing-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10238 (efs-host-type host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10239
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10240 (defun efs-add-listing-type (type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10241 "Interactively adds the specialized listing type TYPE for HOST and USER
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10242 to the listing type cache."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10243 (interactive
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10244 (let ((name (or (buffer-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10245 (and (eq major-mode 'dired-mode)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10246 dired-directory))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10247 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10248 (intern
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10249 (completing-read "Listing type: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10250 (mapcar
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10251 (function (lambda (elt)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10252 (list (symbol-name elt))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10253 efs-listing-types)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10254 nil t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10255 (read-string "Host: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10256 (and name (car (efs-ftp-path name))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10257 (read-string "User: "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10258 (and name (nth 1 (efs-ftp-path name)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10259 (efs-set-host-user-property host user 'listing-type type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10260 (efs-set-process-host-type host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10261
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10262 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10263 ;;;; Auotomagic bug reporting for unrecognized host types.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10264 ;;;; --------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10265
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10266 (defun efs-scream-and-yell-1 (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10267 ;; Internal for efs-scream-and-yell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10268 (with-output-to-temp-buffer "*Help*"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10269 (princ
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10270 (format
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10271 "efs is unable to identify the remote host type of %s.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10272
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10273 Please report this as a bug. It would be very helpful
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10274 if your bug report contained at least the PWD command
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10275 within the *ftp %s@%s* buffer.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10276 If you know them, also send the operating system
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10277 and ftp server types of the remote host." host user host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10278 (if (y-or-n-p "Would you like to submit a bug report now? ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10279 (efs-report-bug host user
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10280 "Bug occurred during efs-guess-host-type." t)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10281
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10282 (defun efs-scream-and-yell (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10283 ;; Advertises that something has gone wrong in identifying the host type.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10284 (if (eq (selected-window) (minibuffer-window))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10285 (efs-abort-recursive-edit-and-then 'efs-scream-and-yell-1 host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10286 (efs-scream-and-yell-1 host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10287 (error "Unable to identify remote host type")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10288
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10289 ;;;; --------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10290 ;;;; Guess at the host type using PWD syntax.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10291 ;;;; --------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10292
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10293 ;; host-type path templates. These should match a pwd performed
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10294 ;; as the first command after connecting. They should be as tight
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10295 ;; as possible
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10296
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10297 (defconst efs-unix-path-template "^/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10298 (defconst efs-apollo-unix-path-template "^//")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10299 (defconst efs-cms-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10300 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10301 "^[-A-Z0-9$*][-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10302 "[-A-Z0-9$*]?[-A-Z0-9$*]?[-A-Z0-9$*]?\\.[0-9][0-9][0-9A-Z]$\\|"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10303 ;; For the SFS version of CMS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10304 "^[-A-Z0-9]+:[-A-Z0-9$*]+\\.$"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10305
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10306 (defconst efs-mvs-path-template "^'?[A-Z][0-9][0-9]?[0-9]?[0-9]?[0-9]?\\.'?")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10307
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10308 (defconst efs-guardian-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10309 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10310 "^\\("
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10311 "\\\\[A-Z0-9][A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?\\."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10312 "\\)?"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10313 "\\$[A-Z0-9][A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?\\."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10314 "[A-Z][A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?$"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10315 ;; guardian and cms are very close to overlapping (they don't). Be careful.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10316 (defconst efs-vms-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10317 "^[-A-Z0-9_$]+:\\[[-A-Z0-9_$]+\\(\\.[-A-Z0-9_$]+\\)*\\]$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10318 (defconst efs-mts-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10319 "^[A-Z0-9._][A-Z0-9._][A-Z0-9._][A-Z0-9._]:$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10320 (defconst efs-ms-unix-path-template "^[A-Za-z0-9]:/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10321
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10322 ;; Following two are for TI lisp machines. Note that lisp machines
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10323 ;; do not have a default directory, but only a default pathname against
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10324 ;; which relative pathnames are merged (Jamie tells me).
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10325 (defconst efs-ti-explorer-pwd-line-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10326 (let* ((excluded-chars ":;<>.#\n\r\t\\/a-z ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10327 (token (concat "[^" excluded-chars "]+")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10328 (concat "^250 "
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10329 token ": " ; host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10330 token "\\(\\." token "\\)*; " ; directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10331 "\\(\\*.\\*\\|\\*\\)#\\(\\*\\|>\\)" ; name, ext, version
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10332 "$"))) ; "*.*#*" or "*.*#>" or "*#*" or "*#>" or "#*" ...
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10333 (defconst efs-ti-twenex-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10334 (let* ((excluded-chars ":;<>.#\n\r\t\\/a-z ")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10335 (token (concat "[^" excluded-chars "]+")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10336 (concat "^"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10337 token ":" ; host name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10338 "<\\(" token "\\)?\\(\\." token "\\)*>" ; directory
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10339 "\\(\\*.\\*\\|\\*\\)" ; name and extension
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10340 "$")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10341
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10342 (defconst efs-tops-20-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10343 "^[-A-Z0-9_$]+:<[-A-Z0-9_$]\\(.[-A-Z0-9_$]+\\)*>$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10344 (defconst efs-pc-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10345 "^[a-zA-Z0-9]:\\\\\\([-_+=a-zA-Z0-9.]+\\\\\\)*[-_+=a-zA-Z0-9.]*$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10346 (defconst efs-mpe-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10347 (let ((token (concat "[A-Z][A-Z0-9]?[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10348 "[A-Z0-9]?[A-Z0-9]?[A-Z0-9]?")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10349 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10350 ;; optional session name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10351 "^\\(" token "\\)?,"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10352 ;; username
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10353 token "."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10354 ;; account
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10355 token ","
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10356 ;; group
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10357 token "$")))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10358 (defconst efs-vos-path-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10359 (let ((token "[][@\\^`{}|~\"$+,---./:_a-zA-Z0-9]+"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10360 (concat
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10361 "%" token ; host
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10362 "#" token ; disk
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10363 "\\(>" token "\\)+" ; directories
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10364 )))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10365 (defconst efs-netware-path-template "^[-A-Z0-9_][-A-Z0-9_/]*:/")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10366 ;; Sometimes netware doesn't return a device to a PWD. Then it will be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10367 ;; recognized by the listing parser.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10368
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10369 (defconst efs-nos-ve-path-template "^:[A-Z0-9]")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10370 ;; Matches the path for NOS/VE
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10371
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10372 (defconst efs-mvs-pwd-line-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10373 ;; Not sure how the PWD parser will do with empty strings, so treate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10374 ;; this as a line regexp.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10375 "^257 \\([Nn]o prefix defined\\|\"\" is working directory\\)")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10376 (defconst efs-cms-pwd-line-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10377 "^450 No current working directory defined$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10378 (defconst efs-tops-20-pwd-line-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10379 "^500 I never heard of the \\(XPWD\\|PWD\\) command\\. Try HELP\\.$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10380 (defconst efs-dos:ftp-pwd-line-template
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10381 "^250 Current working directory is +")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10382 (defconst efs-coke-pwd-line-template "^257 Current balance \\$[0-9]")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10383
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10384 (defconst efs-super-dumb-unix-tilde-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10385 "^550 /.*: No such file or directory\\.?$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10386 (defconst efs-cms-knet-tilde-regexp
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10387 "^501 Invalid CMS fileid: ~$")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10388
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10389
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10390 ;; It might be nice to message users about the host type identified,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10391 ;; but there is so much other messaging going on, it would not be
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10392 ;; seen. No point in slowing things down just so users can read
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10393 ;; a host type message.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10394
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10395 (defun efs-guess-host-type (host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10396 "Guess the host type of HOST.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10397 Does a PWD and examines the directory syntax. The PWD is then cached for use
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10398 in file name expansion."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10399 (let ((host-type (efs-host-type host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10400 (key (concat host "/" user "/~"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10401 syst)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10402 (efs-save-match-data
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10403 (if (eq host-type 'unknown)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10404 ;; Note that efs-host-type returns unknown as the default.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10405 ;; Since we don't yet know the host-type, we use the default
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10406 ;; version of efs-send-pwd. We compensate if necessary
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10407 ;; by looking at the entire line of output.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10408 (let* ((result (efs-send-pwd nil host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10409 (dir (car result))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10410 (line (cdr result)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10411 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10412
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10413 ;; First sift through process lines to see if we recognize
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10414 ;; any pwd errors, or full line messages.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10415
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10416 ;; CMS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10417 ((string-match efs-cms-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10418 (setq host-type (efs-add-host 'cms host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10419 dir (concat "/" (if (> (length user) 8)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10420 (substring user 0 8)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10421 user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10422 ".191"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10423 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10424 "Unable to determine a \"home\" CMS minidisk. Assuming %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10425 dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10426 (sit-for 1))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10427
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10428 ;; TOPS-20
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10429 ((string-match efs-tops-20-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10430 (setq host-type (efs-add-host 'tops-20 host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10431 dir (car (efs-send-pwd 'tops-20 host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10432
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10433 ;; TI-EXPLORER lisp machine. pwd works here, but the output
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10434 ;; needs to be specially parsed since spaces separate
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10435 ;; hostnames from dirs from filenames.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10436 ((string-match efs-ti-explorer-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10437 (setq host-type (efs-add-host 'ti-explorer host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10438 dir (substring line 4)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10439
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10440 ;; FTP Software's DOS Server
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10441 ((string-match efs-dos:ftp-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10442 (setq host-type (efs-add-host 'dos host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10443 dir (substring line (match-end 0)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10444 (efs-add-listing-type 'dos:ftp host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10445
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10446 ;; MVS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10447 ((string-match efs-mvs-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10448 (setq host-type (efs-add-host 'mvs host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10449 dir "")) ; "" will convert to /, which is always
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10450 ; the mvs home dir.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10451
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10452 ;; COKE
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10453 ((string-match efs-coke-pwd-line-template line)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10454 (setq host-type (efs-add-host 'coke host)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10455 dir "/"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10456
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10457 ;; Try to get tilde.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10458 ((null dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10459 (let ((tilde (nth 1 (efs-send-cmd
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10460 host user (list 'get "~" "/dev/null")))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10461 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10462 ;; super dumb unix
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10463 ((string-match efs-super-dumb-unix-tilde-regexp tilde)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10464 (setq dir (car (efs-send-pwd 'super-dumb-unix host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10465 host-type (efs-add-host 'super-dumb-unix host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10466
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10467 ;; Try for cms-knet
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10468 ((string-match efs-cms-knet-tilde-regexp tilde)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10469 (setq dir (car (efs-send-pwd 'cms-knet host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10470 host-type (efs-add-host 'cms-knet host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10471
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10472 ;; We don't know. Scream and yell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10473 (efs-scream-and-yell host user))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10474
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10475 ;; Now look at dir to determine host type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10476
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10477 ;; try for UN*X-y type stuff
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10478 ((string-match efs-unix-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10479 (if
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10480 ;; Check for apollo, so we know not to short-circuit //.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10481 (string-match efs-apollo-unix-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10482 (progn
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10483 (setq host-type (efs-add-host 'apollo-unix host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10484 (efs-add-listing-type 'unix:unknown host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10485 ;; could be ka9q, dos-distinct, plus any of the unix breeds,
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10486 ;; except apollo.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10487 (if (setq syst (efs-get-syst host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10488 (let ((case-fold-search t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10489 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10490 ((string-match "\\bNetware\\b" syst)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10491 (setq host-type (efs-add-host 'netware host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10492 ((string-match "^Plan 9" syst)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10493 (setq host-type (efs-add-host 'plan9 host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10494 ((string-match "^UNIX" syst)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10495 (setq host-type (efs-add-host 'unix host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10496 (efs-add-listing-type 'unix:unknown host user)))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10497
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10498 ;; try for VMS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10499 ((string-match efs-vms-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10500 (setq host-type (efs-add-host 'vms host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10501
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10502 ;; try for MTS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10503 ((string-match efs-mts-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10504 (setq host-type (efs-add-host 'mts host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10505
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10506 ;; try for CMS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10507 ((string-match efs-cms-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10508 (setq host-type (efs-add-host 'cms host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10509
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10510 ;; try for Tandem's guardian OS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10511 ((string-match efs-guardian-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10512 (setq host-type (efs-add-host 'guardian host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10513
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10514 ;; Try for TOPS-20. pwd doesn't usually work for tops-20
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10515 ;; But who knows???
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10516 ((string-match efs-tops-20-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10517 (setq host-type (efs-add-host 'tops-20 host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10518
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10519 ;; Try for DOS or OS/2.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10520 ((string-match efs-pc-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10521 (let ((syst (efs-get-syst host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10522 (case-fold-search t))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10523 (if (and syst (string-match "^OS/2 " syst))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10524 (setq host-type (efs-add-host 'os2 host))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10525 (setq host-type (efs-add-host 'dos host)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10526
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10527 ;; try for TI-TWENEX lisp machine
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10528 ((string-match efs-ti-twenex-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10529 (setq host-type (efs-add-host 'ti-twenex host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10530
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10531 ;; try for MPE
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10532 ((string-match efs-mpe-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10533 (setq host-type (efs-add-host 'mpe host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10534
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10535 ;; try for VOS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10536 ((string-match efs-vos-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10537 (setq host-type (efs-add-host 'vos host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10538
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10539 ;; try for the microsoft server in unix mode
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10540 ((string-match efs-ms-unix-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10541 (setq host-type (efs-add-host 'ms-unix host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10542
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10543 ;; Netware?
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10544 ((string-match efs-netware-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10545 (setq host-type (efs-add-host 'netware host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10546
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10547 ;; Try for MVS
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10548 ((string-match efs-mvs-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10549 (if (string-match "^'.+'$" dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10550 ;; broken MVS PWD quoting
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10551 (setq dir (substring dir 1 -1)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10552 (setq host-type (efs-add-host 'mvs host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10553
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10554 ;; Try for NOS/VE
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10555 ((string-match efs-nos-ve-path-template dir)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10556 (setq host-type (efs-add-host 'nos-ve host)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10557
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10558 ;; We don't know. Scream and yell.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10559 (t
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10560 (efs-scream-and-yell host user)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10561
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10562 ;; Now that we have done a pwd, might as well put it in
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10563 ;; the expand-dir hashtable.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10564 (if dir
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10565 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10566 key
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10567 (efs-internal-directory-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10568 (efs-fix-path host-type dir 'reverse))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10569 efs-expand-dir-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10570 (memq host-type efs-case-insensitive-host-types))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10571
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10572 ;; host-type has been identified by regexp, set the mode-line.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10573 (efs-set-process-host-type host user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10574
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10575 ;; Some special cases, where we need to store the cwd on login.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10576 (if (not (efs-hash-entry-exists-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10577 key efs-expand-dir-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10578 (cond
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10579 ;; CMS: We will be doing cd's, so we'd better make sure that
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10580 ;; we know where home is.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10581 ((eq host-type 'cms)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10582 (let* ((res (efs-send-pwd 'cms host user))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10583 (dir (car res))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10584 (line (cdr res)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10585 (if (and dir (not (string-match
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10586 efs-cms-pwd-line-template line)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10587 (setq dir (concat "/" dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10588 (setq dir (concat "/" (if (> (length user) 8)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10589 (substring user 0 8)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10590 user)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10591 ".191"))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10592 (message
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10593 "Unable to determine a \"home\" CMS minidisk. Assuming %s"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10594 dir))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10595 (efs-put-hash-entry
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10596 key dir efs-expand-dir-hashtable
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10597 (memq 'cms efs-case-insensitive-host-types))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10598 ;; MVS: pwd doesn't work in the root directory, so we stuff this
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10599 ;; into the hashtable manually.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10600 ((eq host-type 'mvs)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10601 (efs-put-hash-entry key "/" efs-expand-dir-hashtable))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10602 ))))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10603
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10604
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10605 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10606 ;;;; efs-autoloads
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10607 ;;;; These provide the entry points for the non-unix packages.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10608 ;;;; -----------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10609
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10610 (efs-autoload 'efs-fix-path vms "efs-vms")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10611 (efs-autoload 'efs-fix-path mts "efs-mts")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10612 (efs-autoload 'efs-fix-path cms "efs-cms")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10613 (efs-autoload 'efs-fix-path ti-explorer "efs-ti-explorer")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10614 (efs-autoload 'efs-fix-path ti-twenex "efs-ti-twenex")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10615 (efs-autoload 'efs-fix-path dos "efs-pc")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10616 (efs-autoload 'efs-fix-path mvs "efs-mvs")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10617 (efs-autoload 'efs-fix-path tops-20 "efs-tops-20")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10618 (efs-autoload 'efs-fix-path mpe "efs-mpe")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10619 (efs-autoload 'efs-fix-path os2 "efs-pc")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10620 (efs-autoload 'efs-fix-path vos "efs-vos")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10621 (efs-autoload 'efs-fix-path ms-unix "efs-ms-unix")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10622 (efs-autoload 'efs-fix-path netware "efs-netware")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10623 (efs-autoload 'efs-fix-path cms-knet "efs-cms-knet")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10624 (efs-autoload 'efs-fix-path guardian "efs-guardian")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10625 (efs-autoload 'efs-fix-path nos-ve "efs-nos-ve")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10626
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10627 (efs-autoload 'efs-fix-dir-path vms "efs-vms")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10628 (efs-autoload 'efs-fix-dir-path mts "efs-mts")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10629 (efs-autoload 'efs-fix-dir-path cms "efs-cms")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10630 (efs-autoload 'efs-fix-dir-path ti-explorer "efs-ti-explorer")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10631 (efs-autoload 'efs-fix-dir-path ti-twenex "efs-ti-twenex")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10632 (efs-autoload 'efs-fix-dir-path dos "efs-pc")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10633 (efs-autoload 'efs-fix-dir-path mvs "efs-mvs")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10634 (efs-autoload 'efs-fix-dir-path tops-20 "efs-tops-20")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10635 (efs-autoload 'efs-fix-dir-path mpe "efs-mpe")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10636 (efs-autoload 'efs-fix-dir-path os2 "efs-pc")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10637 (efs-autoload 'efs-fix-dir-path vos "efs-vos")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10638 (efs-autoload 'efs-fix-dir-path hell "efs-hell")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10639 (efs-autoload 'efs-fix-dir-path ms-unix "efs-ms-unix")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10640 (efs-autoload 'efs-fix-dir-path netware "efs-netware")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10641 (efs-autoload 'efs-fix-dir-path plan9 "efs-plan9")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10642 (efs-autoload 'efs-fix-dir-path cms-knet "efs-cms-knet")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10643 (efs-autoload 'efs-fix-dir-path guardian "efs-guardian")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10644 (efs-autoload 'efs-fix-dir-path nos-ve "efs-nos-ve")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10645 (efs-autoload 'efs-fix-dir-path coke "efs-coke")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10646
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10647 ;; A few need to autoload a pwd function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10648 (efs-autoload 'efs-send-pwd tops-20 "efs-tops-20")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10649 (efs-autoload 'efs-send-pwd cms-knet "efs-cms-knet")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10650 (efs-autoload 'efs-send-pwd ti-explorer "efs-ti-explorer")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10651 (efs-autoload 'efs-send-pwd hell "efs-hell")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10652 (efs-autoload 'efs-send-pwd mvs "efs-mvs")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10653 (efs-autoload 'efs-send-pwd coke "efs-coke")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10654
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10655 ;; A few packages are loaded by the listing parser.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10656 (efs-autoload 'efs-parse-listing ka9q "efs-ka9q")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10657 (efs-autoload 'efs-parse-listing unix:dl "efs-dl")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10658 (efs-autoload 'efs-parse-listing dos-distinct "efs-dos-distinct")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10659 (efs-autoload 'efs-parse-listing hell "efs-hell")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10660 (efs-autoload 'efs-parse-listing netware "efs-netware")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10661
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10662 ;; Packages that need to autoload for child-lookup
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10663 (efs-autoload 'efs-allow-child-lookup plan9 "efs-plan9")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10664 (efs-autoload 'efs-allow-child-lookup coke "efs-coke")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10665
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10666 ;; Packages that need to autoload for file-exists-p and file-directory-p
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10667 (efs-autoload 'efs-internal-file-exists-p guardian "efs-guardian")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10668 (efs-autoload 'efs-internal-file-directory-p guardian "efs-guardian")
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10669
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10670
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10671
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10672 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10673 ;;;; >10
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10674 ;;;; Attaching onto the appropriate Emacs version
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10675 ;;;; ============================================================
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10676
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10677 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10678 ;;;; Connect to various hooks.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10679 ;;;; -------------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10680
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10681 (or (memq 'efs-set-buffer-mode find-file-hooks)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10682 (setq find-file-hooks
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10683 (cons 'efs-set-buffer-mode find-file-hooks)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10684
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10685 ;;; We are using our own dired.el, so this doesn't depend on Emacs flavour.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10686
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10687 (if (featurep 'dired)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10688 (require 'efs-dired)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10689 (add-hook 'dired-load-hook (function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10690 (lambda ()
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10691 (require 'efs-dired)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10692
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10693 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10694 ;;;; Add to minor-mode-alist.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10695 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10696
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10697 (or (assq 'efs-process-host-type minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10698 (if (assq 'dired-sort-mode minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10699 (let ((our-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10700 (nconc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10701 (delq nil
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10702 (list (assq 'dired-sort-mode minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10703 (assq 'dired-subdir-omit minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10704 (assq 'dired-marker-stack minor-mode-alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10705 (list '(efs-process-host-type efs-process-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10706 '(efs-dired-listing-type
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10707 efs-dired-listing-type-string))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10708 (old-list (delq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10709 (assq 'efs-process-host-type minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10710 (delq
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10711 (assq 'efs-dired-listing-type minor-mode-alist)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10712 minor-mode-alist))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10713 (setq minor-mode-alist nil)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10714 (while old-list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10715 (or (assq (car (car old-list)) our-list)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10716 (setq minor-mode-alist (nconc minor-mode-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10717 (list (car old-list)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10718 (setq old-list (cdr old-list)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10719 (setq minor-mode-alist (nconc our-list minor-mode-alist)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10720 (setq minor-mode-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10721 (nconc
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10722 (list '(efs-process-host-type efs-process-host-type)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10723 '(efs-dired-listing-type efs-dired-listing-type-string))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10724 minor-mode-alist))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10725
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10726 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10727 ;;;; File name handlers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10728 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10729
40
7e54bd776075 Import from CVS: tag r19-15b103
cvs
parents: 24
diff changeset
10730 ;;;###autoload
22
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10731 (defun efs-file-handler-function (operation &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10732 "Function to call special file handlers for remote files."
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10733 (let ((handler (get operation 'efs)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10734 (if handler
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10735 (apply handler args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10736 (let ((inhibit-file-name-handlers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10737 (cons 'efs-file-handler-function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10738 (and (eq inhibit-file-name-operation operation)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10739 inhibit-file-name-handlers)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10740 (inhibit-file-name-operation operation))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10741 (apply operation args)))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10742
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10743 (defun efs-sifn-handler-function (operation &rest args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10744 ;; Handler function for substitute-in-file-name
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10745 (if (eq operation 'substitute-in-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10746 (apply 'efs-substitute-in-file-name args)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10747 (let ((inhibit-file-name-handlers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10748 (cons 'efs-sifn-handler-function
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10749 (and (eq operation inhibit-file-name-operation)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10750 inhibit-file-name-handlers)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10751 (inhibit-file-name-operation operation))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10752 (apply operation args))))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10753
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10754 ;; Yes, this is what it looks like. I'm defining the handler to run our
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10755 ;; version whenever there is an environment variable.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10756
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10757 (nconc file-name-handler-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10758 (list
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10759 (cons "\\(^\\|[^$]\\)\\(\\$\\$\\)*\\$[{a-zA-Z0-9]"
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10760 'efs-sifn-handler-function)))
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10761
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10762 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10763 ;;;; Necessary overloads.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10764 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10765
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10766 ;;; The following functions are overloaded, instead of extended via
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10767 ;;; the file-name-handler-alist. For various reasons, the
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10768 ;;; file-name-handler-alist doesn't work for them. It would be nice if
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10769 ;;; this list could be shortened in the future.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10770
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10771 ;; File name exansion. It is not until _after_ a file name has been
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10772 ;; expanded that it is reasonable to test it for a file name handler.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10773 (efs-overwrite-fn "efs" 'expand-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10774
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10775 ;; Loading lisp files. The problem with using the file-name-handler-alist
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10776 ;; here is that we don't know what is to be handled, until after searching
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10777 ;; the load-path. The solution is to change the C code for Fload.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10778 ;; A patch to do this has been written by Jay Adams <jka@ece.cmu.edu>.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10779 (efs-overwrite-fn "efs" 'load)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10780 (efs-overwrite-fn "efs" 'require)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10781
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10782 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10783 ;;;; Install the file handlers for efs-file-handler-function.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10784 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10785
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10786 ;; I/O
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10787 (put 'insert-file-contents 'efs 'efs-insert-file-contents)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10788 (put 'write-region 'efs 'efs-write-region)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10789 (put 'directory-files 'efs 'efs-directory-files)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10790 (put 'list-directory 'efs 'efs-list-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10791 (put 'insert-directory 'efs 'efs-insert-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10792 (put 'recover-file 'efs 'efs-recover-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10793 ;; file properties
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10794 (put 'file-directory-p 'efs 'efs-file-directory-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10795 (put 'file-writable-p 'efs 'efs-file-writable-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10796 (put 'file-readable-p 'efs 'efs-file-readable-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10797 (put 'file-executable-p 'efs 'efs-file-executable-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10798 (put 'file-symlink-p 'efs 'efs-file-symlink-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10799 (put 'file-attributes 'efs 'efs-file-attributes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10800 (put 'file-exists-p 'efs 'efs-file-exists-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10801 (put 'file-accessible-directory-p 'efs 'efs-file-accessible-directory-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10802 ;; manipulating file names
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10803 (put 'file-name-directory 'efs 'efs-file-name-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10804 (put 'file-name-nondirectory 'efs 'efs-file-name-nondirectory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10805 (put 'file-name-as-directory 'efs 'efs-file-name-as-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10806 (put 'directory-file-name 'efs 'efs-directory-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10807 (put 'abbreviate-file-name 'efs 'efs-abbreviate-file-name)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10808 (put 'file-name-sans-versions 'efs 'efs-file-name-sans-versions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10809 (put 'unhandled-file-name-directory 'efs 'efs-unhandled-file-name-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10810 (put 'diff-latest-backup-file 'efs 'efs-diff-latest-backup-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10811 (put 'file-truename 'efs 'efs-file-truename)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10812 ;; modtimes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10813 (put 'verify-visited-file-modtime 'efs 'efs-verify-visited-file-modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10814 (put 'file-newer-than-file-p 'efs 'efs-file-newer-than-file-p)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10815 (put 'set-visited-file-modtime 'efs 'efs-set-visited-file-modtime)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10816 ;; file modes
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10817 (put 'set-file-modes 'efs 'efs-set-file-modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10818 (put 'file-modes 'efs 'efs-file-modes)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10819 ;; buffers
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10820 (put 'backup-buffer 'efs 'efs-backup-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10821 (put 'get-file-buffer 'efs 'efs-get-file-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10822 (put 'create-file-buffer 'efs 'efs-create-file-buffer)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10823 ;; creating and removing files
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10824 (put 'delete-file 'efs 'efs-delete-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10825 (put 'copy-file 'efs 'efs-copy-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10826 (put 'rename-file 'efs 'efs-rename-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10827 (put 'file-local-copy 'efs 'efs-file-local-copy)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10828 (put 'make-directory-internal 'efs 'efs-make-directory-internal)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10829 (put 'delete-directory 'efs 'efs-delete-directory)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10830 (put 'add-name-to-file 'efs 'efs-add-name-to-file)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10831 (put 'make-symbolic-link 'efs 'efs-make-symbolic-link)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10832 ;; file name completion
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10833 (put 'file-name-completion 'efs 'efs-file-name-completion)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10834 (put 'file-name-all-completions 'efs 'efs-file-name-all-completions)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10835
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10836 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10837 ;;;; Finally run any load-hooks.
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10838 ;;;; ------------------------------------------------------------
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10839
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10840 (run-hooks 'efs-load-hook)
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10841
8fc7fe29b841 Import from CVS: tag r19-15b94
cvs
parents:
diff changeset
10842 ;;; end of efs.el