File: efs-mts.el

package info (click to toggle)
xemacs20 20.4-13
  • links: PTS
  • area: main
  • in suites: slink
  • size: 67,324 kB
  • ctags: 57,643
  • sloc: lisp: 586,197; ansic: 184,662; sh: 4,296; asm: 3,179; makefile: 2,021; perl: 1,059; csh: 96; sed: 22
file content (239 lines) | stat: -rw-r--r-- 8,426 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
;; -*-Emacs-Lisp-*-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; File:         efs-mts.el
;; Release:      $efs release: 1.15 $
;; Version:      #Revision: 1.1 $
;; RCS:          
;; Description:  MTS support for efs
;; Author:       Sandy Rutherford <sandy@itp.ethz.ch>
;; Created:      Fri Oct 23 08:51:29 1992
;; Modified:     Sun Nov 27 18:37:18 1994 by sandy on gandalf
;; Language:     Emacs-Lisp
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;; This file is part of efs. See efs.el for copyright
;;; (it's copylefted) and warrranty (there isn't one) information.

(provide 'efs-mts)
(require 'efs)

(defconst efs-mts-version
  (concat (substring "$efs release: 1.15 $" 14 -2)
	  "/"
	  (substring "#Revision: 1.1 $" 11 -2)))

;;;; ------------------------------------------------------------
;;;; MTS support
;;;; ------------------------------------------------------------

;;; efs has full support, including tree dired support, for hosts running
;;; the Michigan terminal system.  It should be able to automatically
;;; recognize any MTS machine. We would be grateful if you
;;; would report any failures to automatically recognize a MTS host as a bug.
;;;
;;; Filename syntax:
;;; 
;;; MTS filenames are entered in a UNIX-y way. For example, if your account
;;; was YYYY, the file FILE in the account XXXX: on mtsg.ubc.ca would be
;;; entered as
;;;   /YYYY@mtsg.ubc.ca:/XXXX:/FILE
;;; In other words, MTS accounts are treated as UNIX directories. Of course,
;;; to access a file in another account, you must have access permission for
;;; it.  If FILE were in your own account, then you could enter it in a
;;; relative path fashion as
;;;   /YYYY@mtsg.ubc.ca:FILE
;;; MTS filenames can be up to 12 characters. Like UNIX, the structure of the
;;; filename does not contain a TYPE (i.e. it can have as many "."'s as you
;;; like.) MTS filenames are always in upper case, and hence be sure to enter
;;; them as such! MTS is not case sensitive, but an EMACS running under UNIX
;;; is.


(defconst efs-mts-date-regexp
  (concat
   " \\(Jan\\|Feb\\|Mar\\|Apr\\|May\\|Jun\\|Jul\\|Aug\\|Sep\\|Oct"
   "\\|Nov\\|Dec\\) [ 123]?[0-9] "))

;;; The following two functions are entry points to this file.
;;; They are put into the appropriate alists in efs.el

(efs-defun efs-fix-path mts (path &optional reverse)
  ;; Convert PATH from UNIX-ish to MTS.
  ;; If REVERSE given then convert from MTS to UNIX-ish.
  (efs-save-match-data
    (if reverse
	(if (string-match "^\\([^:]+:\\)?\\(.*\\)$" path)
	    (let (acct file)
	      (if (match-beginning 1)
		  (setq acct (substring path 0 (match-end 1))))
	      (if (match-beginning 2)
		  (setq file (substring path
					(match-beginning 2) (match-end 2))))
	      (concat (and acct (concat "/" acct "/"))
		      file))
	  (error "path %s didn't match" path))
      (if (string-match "^/\\([^:]+:\\)/\\(.*\\)$" path)
	  (concat (substring path 1 (match-end 1))
		  (substring path (match-beginning 2) (match-end 2)))
	;; Let's hope that mts will recognize it anyway.
	path))))

(efs-defun efs-fix-dir-path mts (dir-path)
;; Convert path from UNIX-ish to MTS ready for a DIRectory listing.
;; Remember that there are no directories in MTS.
  (if (string-equal dir-path "/")
      (error "Cannot get listing for fictitious \"/\" directory.")
    (let ((dir-path (efs-fix-path 'mts dir-path)))
      (cond
       ((string-equal dir-path "")
	"?")
       ((efs-save-match-data (string-match ":$" dir-path))
	(concat dir-path "?"))
       (dir-path))))) ; It's just a single file.


(efs-defun efs-parse-listing mts
  (host user dir path &optional switches)
  ;; Parse the current buffer which is assumed to be in
  ;; mts ftp dir format.
  ;; HOST = remote host name
  ;; USER = remote user name
  ;; DIR = remote directory as a remote full path
  ;; PATH = directory as an efs full path
  ;; SWITCHES are never used here, but they
  ;; must be specified in the argument list for compatibility
  ;; with the unix version of this function.
  (let ((tbl (efs-make-hashtable))
	perms)
    (goto-char (point-min))
    (efs-save-match-data
      (while (re-search-forward efs-mts-date-regexp nil t)
	(beginning-of-line)
	(if (looking-at "[rwed]+")
	    (setq perms (buffer-substring (match-beginning 0) (match-end 0)))
	  (setq perms nil))
	(end-of-line)
	(skip-chars-backward " ")
	(let ((end (point)))
	  (skip-chars-backward "-A-Z0-9_.!")
	  (efs-put-hash-entry (buffer-substring (point) end)
				   (list nil nil nil perms) tbl))
	(forward-line 1)))
      ;; Don't need to bother with ..
    (efs-put-hash-entry "." '(t) tbl)
    tbl))

(efs-defun efs-allow-child-lookup mts (host user dir file)
  ;; Returns t if FILE in directory DIR could possibly be a subdir
  ;; according to its file-name syntax, and therefore a child listing should
  ;; be attempted.

  ;; MTS file system is flat. Only "accounts" are subdirs.
  (string-equal "/" dir))

(efs-defun efs-internal-file-writable-p mts (user owner modes)
  (if (stringp modes)
      (efs-save-match-data
	(null (null (string-match "w" modes))))
    t)) ; guess

(efs-defun efs-internal-file-readable-p mts (user owner modes)
  (if (stringp modes)
      (efs-save-match-data
	(null (null (string-match "r" modes))))
    t)) ; guess

;;; Tree dired support:

;; There aren't too many systems left that use MTS. This dired support will
;; work for the implementation of ftp on mtsg.ubc.ca. I hope other mts systems
;; implement ftp in the same way. If not, it might be necessary to make the
;; following more flexible.

(defconst efs-dired-mts-re-exe nil)

(or (assq 'mts efs-dired-re-exe-alist)
    (setq efs-dired-re-exe-alist
	  (cons (cons 'mts  efs-dired-mts-re-exe)
		efs-dired-re-exe-alist)))

(defconst efs-dired-mts-re-dir nil)

(or (assq 'mts efs-dired-re-dir-alist)
    (setq efs-dired-re-dir-alist
	  (cons (cons 'mts  efs-dired-mts-re-dir)
		efs-dired-re-dir-alist)))

(efs-defun efs-dired-manual-move-to-filename mts
  (&optional raise-error bol eol)
  ;; In dired, move to first char of filename on this line.
  ;; Returns position (point) or nil if no filename on this line.
  ;; This is the MTS version.
  (or eol (setq eol (save-excursion (skip-chars-forward "^\n\r") (point))))
  (if bol
      (goto-char bol)
    (skip-chars-backward "^\n\r"))
  (if (re-search-forward efs-mts-date-regexp eol t)
      (progn
	(skip-chars-forward " ")      ; Eat blanks after date
	(skip-chars-forward "0-9:")   ; Eat time or year
	(skip-chars-forward " ")      ; one space before filename
	(point))
    (and raise-error (error "No file on this line"))))

(efs-defun efs-dired-manual-move-to-end-of-filename mts
  (&optional no-error bol eol)
  ;; Assumes point is at beginning of filename.
  ;; So, it should be called only after (dired-move-to-filename t).
  ;; On failure, signals an error or returns nil.
  ;; This is the MTS version.
  (let ((opoint (point)))
    (and selective-display
	 (null no-error)
	 (eq (char-after
	      (1- (or bol (save-excursion
			    (skip-chars-backward "^\r\n")
			    (point)))))
	     ?\r)
	 ;; File is hidden or omitted.
	 (cond
	  ((dired-subdir-hidden-p (dired-current-directory))
	   (error
	    (substitute-command-keys
	     "File line is hidden. Type \\[dired-hide-subdir] to unhide.")))
	  ((error
	    (substitute-command-keys
	     "File line is omitted. Type \\[dired-omit-toggle] to un-omit."
	     )))))
    (skip-chars-forward "-A-Z0-9._!")
    (if (or (= opoint (point)) (not (memq (following-char) '(?\r ?\n))))
	(if no-error
	    nil
	  (error "No file on this line"))
      (point))))

(efs-defun efs-dired-fixup-listing mts (file path &optional switches wildcard)
  ;; If you're not listing your own account, MTS puts the
  ;; account name in front of each filename. Scrape them off.
  ;; PATH will have unix /'s on it.
  ;; file-name-directory is in case of wildcards
  (let ((len (length path)))
    (if (> len 2)
	(progn
	  (if (= (aref path (1- len)) ?/)
	      (setq path (substring path -2))
	    (setq path (substring path -1)))
	  (goto-char (point-min))
	  (while (search-forward path nil t)
	    (delete-region (match-beginning 0) (match-end 0)))))))

(efs-defun efs-dired-insert-headerline mts (dir)
  ;; MTS has no total line, so we insert a blank line for
  ;; aesthetics.
  (insert "\n")
  (forward-char -1)
  (efs-real-dired-insert-headerline dir))

;;; end of efs-mts.el