* net/tramp-smb.el (tramp-smb-errors): Add error messages.

(tramp-smb-get-share, tramp-smb-get-localname): Use only VEC as
parameter.
(tramp-smb-handle-add-name-to-file)
(tramp-smb-handle-copy-directory, tramp-smb-handle-copy-file)
(tramp-smb-handle-delete-directory, tramp-smb-handle-delete-file)
(tramp-smb-handle-file-attributes)
(tramp-smb-do-file-attributes-with-stat)
(tramp-smb-handle-file-local-copy)
(tramp-smb-handle-insert-directory)
(tramp-smb-handle-make-directory)
(tramp-smb-handle-make-directory-internal)
(tramp-smb-handle-make-symbolic-link)
(tramp-smb-handle-rename-file, tramp-smb-handle-set-file-modes)
(tramp-smb-handle-write-region, tramp-smb-get-file-entries)
(tramp-smb-maybe-open-connection): Apply the changed parameters.
(tramp-smb-read-file-entry): Read Disk names in compressed format.
Handle long file names.
(tramp-smb-get-cifs-capabilities): Check, whether the connection
process is running.
(tramp-smb-maybe-open-connection): Trace "smbclient -V" command.
Read share names with "-g" option.
This commit is contained in:
Michael Albinus 2009-10-15 13:17:19 +00:00
parent ec5145d684
commit 4260b4027e
2 changed files with 199 additions and 165 deletions

View file

@ -1,3 +1,31 @@
2009-10-15 Michael Albinus <michael.albinus@gmx.de>
* net/tramp.el (tramp-replace-environment-variables): Do not fail
if the environment variable does not exist.
* net/tramp-smb.el (tramp-smb-errors): Add error messages.
(tramp-smb-get-share, tramp-smb-get-localname): Use only VEC as
parameter.
(tramp-smb-handle-add-name-to-file)
(tramp-smb-handle-copy-directory, tramp-smb-handle-copy-file)
(tramp-smb-handle-delete-directory, tramp-smb-handle-delete-file)
(tramp-smb-handle-file-attributes)
(tramp-smb-do-file-attributes-with-stat)
(tramp-smb-handle-file-local-copy)
(tramp-smb-handle-insert-directory)
(tramp-smb-handle-make-directory)
(tramp-smb-handle-make-directory-internal)
(tramp-smb-handle-make-symbolic-link)
(tramp-smb-handle-rename-file, tramp-smb-handle-set-file-modes)
(tramp-smb-handle-write-region, tramp-smb-get-file-entries)
(tramp-smb-maybe-open-connection): Apply the changed parameters.
(tramp-smb-read-file-entry): Read Disk names in compressed format.
Handle long file names.
(tramp-smb-get-cifs-capabilities): Check, whether the connection
process is running.
(tramp-smb-maybe-open-connection): Trace "smbclient -V" command.
Read share names with "-g" option.
2009-10-15 Ryan Yeske <rcyeske@gmail.com>
* net/rcirc.el (rcirc-view-log-file): New command.

View file

@ -76,6 +76,7 @@
"Server doesn't support UNIX CIFS calls"
;; Samba.
"ERRDOS"
"ERRHRD"
"ERRSRV"
"ERRbadfile"
"ERRbadpw"
@ -241,31 +242,30 @@ pass to the OPERATION."
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v2 (file-name-directory v2-localname))
(tramp-flush-file-property v2 v2-localname)
(let ((cifs (tramp-smb-get-cifs-capabilities v1)))
(unless
(tramp-smb-send-command
v1
(format
"%s \"%s\" \"%s\""
(if cifs "link" "hardlink")
(tramp-smb-get-localname v1-localname (not cifs))
(tramp-smb-get-localname v2-localname (not cifs))))
(tramp-error
v2 'file-error
"error with add-name-to-file, see buffer `%s' for details"
(buffer-name)))))))
(unless
(tramp-smb-send-command
v1
(format
"%s \"%s\" \"%s\""
(if (tramp-smb-get-cifs-capabilities v1) "link" "hardlink")
(tramp-smb-get-localname v1)
(tramp-smb-get-localname v2)))
(tramp-error
v2 'file-error
"error with add-name-to-file, see buffer `%s' for details"
(buffer-name))))))
(defun tramp-smb-handle-copy-directory
(dirname newname &optional keep-date parents)
"Like `copy-directory' for Tramp files."
"Like `copy-directory' for Tramp files. KEEP-DATE is not handled."
(setq dirname (expand-file-name dirname)
newname (expand-file-name newname))
(let ((t1 (tramp-tramp-file-p dirname))
(t2 (tramp-tramp-file-p newname)))
(with-parsed-tramp-file-name (if t1 dirname newname) nil
(cond
;; We must use a local temporary directory.
((and t1 t2)
;; We must copy, using a local temporary directory.
(let ((tmpdir
(make-temp-name
(expand-file-name
@ -276,11 +276,11 @@ pass to the OPERATION."
(copy-directory dirname tmpdir keep-date parents)
(copy-directory tmpdir newname keep-date parents))
(delete-directory tmpdir 'recursive))))
;; We can copy recursively.
((or t1 t2)
;; We can copy recursively.
(let ((prompt (tramp-smb-send-command v "prompt"))
(recurse (tramp-smb-send-command v "recurse"))
(cifs (tramp-smb-get-cifs-capabilities v)))
(recurse (tramp-smb-send-command v "recurse")))
(unless (file-directory-p newname)
(make-directory newname parents))
(unwind-protect
@ -288,9 +288,7 @@ pass to the OPERATION."
(and
prompt recurse
(tramp-smb-send-command
v (format
"cd \"%s\""
(tramp-smb-get-localname localname (not cifs))))
v (format "cd \"%s\"" (tramp-smb-get-localname v)))
(tramp-smb-send-command
v (format "lcd \"%s\"" (if t1 newname dirname)))
(if t1
@ -304,12 +302,15 @@ pass to the OPERATION."
v 'file-error
"%s `%s'" (match-string 0) (if t1 dirname newname))))
;; Go home.
(tramp-smb-send-command v (format "cd %s" (if cifs "/" "\\")))
(tramp-smb-send-command
v (format
"cd %s" (if (tramp-smb-get-cifs-capabilities v) "/" "\\")))
;; Toggle prompt and recurse OFF.
(if prompt (tramp-smb-send-command v "prompt"))
(if recurse (tramp-smb-send-command v "recurse")))))
;; We must do it file-wise.
(t
;; We must do it file-wise.
(tramp-run-real-handler
'copy-directory (list dirname newname keep-date parents)))))))
@ -345,18 +346,16 @@ PRESERVE-UID-GID is completely ignored."
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)
(let ((share (tramp-smb-get-share localname))
(file (tramp-smb-get-localname
localname (not (tramp-smb-get-cifs-capabilities v)))))
(unless share
(tramp-error
v 'file-error "Target `%s' must contain a share name" newname))
(tramp-message v 0 "Copying file %s to file %s..." filename newname)
(if (tramp-smb-send-command
v (format "put %s \"%s\"" filename file))
(tramp-message
v 0 "Copying file %s to file %s...done" filename newname)
(tramp-error v 'file-error "Cannot copy `%s'" filename))))))
(unless (tramp-smb-get-share v)
(tramp-error
v 'file-error "Target `%s' must contain a share name" newname))
(tramp-message v 0 "Copying file %s to file %s..." filename newname)
(if (tramp-smb-send-command
v (format "put \"%s\" \"%s\""
filename (tramp-smb-get-localname v)))
(tramp-message
v 0 "Copying file %s to file %s...done" filename newname)
(tramp-error v 'file-error "Cannot copy `%s'" filename)))))
;; KEEP-DATE handling.
(when keep-date (set-file-times newname (nth 5 (file-attributes filename)))))
@ -374,23 +373,23 @@ PRESERVE-UID-GID is completely ignored."
;; We do not want to delete "." and "..".
(directory-files
directory 'full "^\\([^.]\\|\\.\\([^.]\\|\\..\\)\\).*")))
(with-parsed-tramp-file-name directory nil
;; We must also flush the cache of the directory, because
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-directory-property v localname)
(let ((cifs (tramp-smb-get-cifs-capabilities v)))
(unless (tramp-smb-send-command
v (format
"%s \"%s\""
(if cifs "posix_rmdir" "rmdir")
(tramp-smb-get-localname localname (not cifs))))
;; Error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error
v 'file-error "%s `%s'" (match-string 0) directory)))))))
(unless (tramp-smb-send-command
v (format
"%s \"%s\""
(if (tramp-smb-get-cifs-capabilities v) "posix_rmdir" "rmdir")
(tramp-smb-get-localname v)))
;; Error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error
v 'file-error "%s `%s'" (match-string 0) directory))))))
(defun tramp-smb-handle-delete-file (filename)
"Like `delete-file' for Tramp files."
@ -401,18 +400,17 @@ PRESERVE-UID-GID is completely ignored."
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)
(let ((cifs (tramp-smb-get-cifs-capabilities v)))
(unless (tramp-smb-send-command
v (format
"%s \"%s\""
(if cifs "posix_unlink" "rm")
(tramp-smb-get-localname localname (not cifs))))
;; Error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error
v 'file-error "%s `%s'" (match-string 0) filename)))))))
(unless (tramp-smb-send-command
v (format
"%s \"%s\""
(if (tramp-smb-get-cifs-capabilities v) "posix_unlink" "rm")
(tramp-smb-get-localname v)))
;; Error.
(with-current-buffer (tramp-get-connection-buffer v)
(goto-char (point-min))
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error
v 'file-error "%s `%s'" (match-string 0) filename))))))
(defun tramp-smb-handle-directory-files
(directory &optional full match nosort)
@ -480,9 +478,8 @@ PRESERVE-UID-GID is completely ignored."
(unless id-format (setq id-format 'integer))
(with-parsed-tramp-file-name filename nil
(with-file-property v localname (format "file-attributes-%s" id-format)
(if (and (tramp-smb-get-share localname)
(tramp-smb-get-cifs-capabilities v))
(tramp-smb-do-file-attributes-with-stat v localname id-format)
(if (and (tramp-smb-get-share v) (tramp-smb-get-cifs-capabilities v))
(tramp-smb-do-file-attributes-with-stat v id-format)
;; Reading just the filename entry via "dir localname" is not
;; possible, because when filename is a directory, some
;; smbclient versions return the content of the directory, and
@ -513,21 +510,27 @@ PRESERVE-UID-GID is completely ignored."
inode ;10 inode number
device))))))) ;11 file system number
(defun tramp-smb-do-file-attributes-with-stat
(vec localname &optional id-format)
(defun tramp-smb-do-file-attributes-with-stat (vec &optional id-format)
"Implement `file-attributes' for Tramp files using stat command."
(tramp-message vec 5 "file attributes with stat: %s" localname)
(tramp-message
vec 5 "file attributes with stat: %s" (tramp-file-name-localname vec))
(with-current-buffer (tramp-get-buffer vec)
(let* ((file (tramp-smb-get-localname localname nil))
size id link uid gid atime mtime ctime mode inode)
(tramp-smb-send-command vec (format "stat \"%s\"" file))
(let* (size id link uid gid atime mtime ctime mode inode)
(unless
(tramp-smb-send-command
vec (format "stat \"%s\"" (tramp-smb-get-localname vec)))
;; Error.
(with-current-buffer (tramp-get-connection-buffer vec)
(goto-char (point-min))
(search-forward-regexp tramp-smb-errors nil t)
(tramp-error
vec 'file-error "%s" (match-string 0))))
;; Loop the listing.
(goto-char (point-min))
(unless (re-search-forward tramp-smb-errors nil t)
(while (not (eobp))
(cond
;;File: /dbus
((looking-at
"Size:\\s-+\\([0-9]+\\)\\s-+Blocks:\\s-+[0-9]+\\s-+\\(\\w+\\)")
(setq size (string-to-number (match-string 1))
@ -595,18 +598,16 @@ PRESERVE-UID-GID is completely ignored."
(tramp-error
v 'file-error
"Cannot make local copy of non-existing file `%s'" filename))
(let ((file (tramp-smb-get-localname
localname (not (tramp-smb-get-cifs-capabilities v))))
(tmpfile (tramp-compat-make-temp-file filename)))
(let ((tmpfile (tramp-compat-make-temp-file filename)))
(tramp-message v 4 "Fetching %s to tmp file %s..." filename tmpfile)
(if (tramp-smb-send-command v (format "get \"%s\" %s" file tmpfile))
(if (tramp-smb-send-command
v (format "get \"%s\" \"%s\"" (tramp-smb-get-localname v) tmpfile))
(tramp-message
v 4 "Fetching %s to tmp file %s...done" filename tmpfile)
;; Oops, an error. We shall cleanup.
(delete-file tmpfile)
(tramp-error
v 'file-error
"Cannot make local copy of file `%s'" filename))
v 'file-error "Cannot make local copy of file `%s'" filename))
tmpfile)))
;; This function should return "foo/" for directories and "bar" for
@ -652,8 +653,7 @@ PRESERVE-UID-GID is completely ignored."
(setq filename (file-name-as-directory filename)))
(with-parsed-tramp-file-name filename nil
(save-match-data
(let ((cifs (tramp-smb-get-cifs-capabilities v))
(base (file-name-nondirectory filename))
(let ((base (file-name-nondirectory filename))
;; We should not destroy the cache entry.
(entries (copy-sequence
(tramp-smb-get-file-entries
@ -710,8 +710,10 @@ PRESERVE-UID-GID is completely ignored."
(lambda (x)
(when (not (zerop (length (nth 0 x))))
(let ((attr
(when cifs
(file-attributes (expand-file-name (nth 0 x)) 'string))))
(when (tramp-smb-get-cifs-capabilities v)
(ignore-errors
(file-attributes
(expand-file-name (nth 0 x)) 'string)))))
(insert
(format
"%10s %3d %-8s %-8s %8s %s %s\n"
@ -739,10 +741,11 @@ PRESERVE-UID-GID is completely ignored."
(setq dir (expand-file-name dir default-directory)))
(with-parsed-tramp-file-name dir nil
(save-match-data
(let* ((share (tramp-smb-get-share localname))
(ldir (file-name-directory dir)))
(let* ((ldir (file-name-directory dir)))
;; Make missing directory parts.
(when (and parents share (not (file-directory-p ldir)))
(when (and parents
(tramp-smb-get-share v)
(not (file-directory-p ldir)))
(make-directory ldir parents))
;; Just do it.
(when (file-directory-p ldir)
@ -757,12 +760,11 @@ PRESERVE-UID-GID is completely ignored."
(setq directory (expand-file-name directory default-directory)))
(with-parsed-tramp-file-name directory nil
(save-match-data
(let* ((cifs (tramp-smb-get-cifs-capabilities v))
(file (tramp-smb-get-localname localname (not cifs))))
(let* ((file (tramp-smb-get-localname v)))
(when (file-directory-p (file-name-directory directory))
(tramp-smb-send-command
v
(if cifs
(if (tramp-smb-get-cifs-capabilities v)
(format
"posix_mkdir \"%s\" %s"
file (tramp-decimal-to-octal (default-file-modes)))
@ -820,8 +822,8 @@ target of the symlink differ."
v1
(format
"symlink \"%s\" \"%s\""
(tramp-smb-get-localname v1-localname nil)
(tramp-smb-get-localname v2-localname nil)))
(tramp-smb-get-localname v1)
(tramp-smb-get-localname v2)))
(tramp-error
v2 'file-error
"error with make-symbolic-link, see buffer `%s' for details"
@ -856,13 +858,12 @@ target of the symlink differ."
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)
(let ((file (tramp-smb-get-localname
localname (not (tramp-smb-get-cifs-capabilities v)))))
(tramp-message v 0 "Copying file %s to file %s..." filename newname)
(if (tramp-smb-send-command v (format "put %s \"%s\"" filename file))
(tramp-message
v 0 "Copying file %s to file %s...done" filename newname)
(tramp-error v 'file-error "Cannot rename `%s'" filename))))))
(tramp-message v 0 "Copying file %s to file %s..." filename newname)
(if (tramp-smb-send-command
v (format "put %s \"%s\"" filename (tramp-smb-get-localname v)))
(tramp-message
v 0 "Copying file %s to file %s...done" filename newname)
(tramp-error v 'file-error "Cannot rename `%s'" filename)))))
(delete-file filename))
@ -873,7 +874,7 @@ target of the symlink differ."
(tramp-flush-file-property v localname)
(unless (tramp-smb-send-command
v (format "chmod \"%s\" %s"
(tramp-smb-get-localname localname nil)
(tramp-smb-get-localname v)
(tramp-decimal-to-octal mode)))
(tramp-error
v 'file-error "Error while changing file's mode %s" filename)))))
@ -910,9 +911,7 @@ errors for shares like \"C$/\", which are common in Microsoft Windows."
;; `file-attributes' reads the values from there.
(tramp-flush-file-property v (file-name-directory localname))
(tramp-flush-file-property v localname)
(let ((file (tramp-smb-get-localname
localname (not (tramp-smb-get-cifs-capabilities v))))
(curbuf (current-buffer))
(let ((curbuf (current-buffer))
(tmpfile (tramp-compat-make-temp-file filename)))
;; We say `no-message' here because we don't want the visited file
;; modtime data to be clobbered from the temp file. We call
@ -925,7 +924,8 @@ errors for shares like \"C$/\", which are common in Microsoft Windows."
(tramp-message v 5 "Writing tmp file %s to file %s..." tmpfile filename)
(unwind-protect
(if (tramp-smb-send-command v (format "put %s \"%s\"" tmpfile file))
(if (tramp-smb-send-command
v (format "put %s \"%s\"" tmpfile (tramp-smb-get-localname v)))
(tramp-message
v 5 "Writing tmp file %s to file %s...done" tmpfile filename)
(tramp-error v 'file-error "Cannot write `%s'" filename))
@ -941,34 +941,37 @@ errors for shares like \"C$/\", which are common in Microsoft Windows."
;; Internal file name functions.
(defun tramp-smb-get-share (localname)
(defun tramp-smb-get-share (vec)
"Returns the share name of LOCALNAME."
(save-match-data
(when (string-match "^/?\\([^/]+\\)/" localname)
(match-string 1 localname))))
(let ((localname (tramp-file-name-localname vec)))
(when (string-match "^/?\\([^/]+\\)/" localname)
(match-string 1 localname)))))
(defun tramp-smb-get-localname (localname convert)
(defun tramp-smb-get-localname (vec)
"Returns the file name of LOCALNAME.
If CONVERT is non-nil exchange \"/\" by \"\\\\\"."
If VEC has no cifs capabilities, exchange \"/\" by \"\\\\\"."
(save-match-data
(let ((res localname))
(let ((localname (tramp-file-name-localname vec)))
(setq
res (if (string-match "^/?[^/]+/\\(.*\\)" res)
(if convert
(mapconcat
(lambda (x) (if (equal x ?/) "\\" (char-to-string x)))
(match-string 1 res) "")
(match-string 1 res))
(if (string-match "^/?\\([^/]+\\)$" res)
(match-string 1 res)
"")))
localname
(if (string-match "^/?[^/]+\\(/.*\\)" localname)
;; There is a share, sparated by "/".
(if (not (tramp-smb-get-cifs-capabilities vec))
(mapconcat
(lambda (x) (if (equal x ?/) "\\" (char-to-string x)))
(match-string 1 localname) "")
(match-string 1 localname))
;; There is just a share.
(if (string-match "^/?\\([^/]+\\)$" localname)
(match-string 1 localname)
"")))
;; Sometimes we have discarded `substitute-in-file-name'.
(when (string-match "\\(\\$\\$\\)\\(/\\|$\\)" res)
(setq res (replace-match "$" nil nil res 1)))
(when (string-match "\\(\\$\\$\\)\\(/\\|$\\)" localname)
(setq localname (replace-match "$" nil nil localname 1)))
res)))
localname)))
;; Share names of a host are cached. It is very unlikely that the
;; shares do change during connection.
@ -976,12 +979,11 @@ If CONVERT is non-nil exchange \"/\" by \"\\\\\"."
"Read entries which match DIRECTORY.
Either the shares are listed, or the `dir' command is executed.
Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)."
(with-parsed-tramp-file-name directory nil
(with-parsed-tramp-file-name (file-name-as-directory directory) nil
(setq localname (or localname "/"))
(with-file-property v localname "file-entries"
(with-current-buffer (tramp-get-buffer v)
(let* ((share (tramp-smb-get-share localname))
(file (tramp-smb-get-localname localname nil))
(let* ((share (tramp-smb-get-share v))
(cache (tramp-get-connection-property v "share-cache" nil))
res entry)
@ -990,17 +992,16 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)."
(setq res cache)
;; Read entries.
(setq file (file-name-as-directory file))
(when (string-match "^\\./" file)
(setq file (substring file 1)))
(if share
(tramp-smb-send-command v (format "dir \"%s*\"" file))
(tramp-smb-send-command
v (format "dir \"%s*\"" (tramp-smb-get-localname v)))
;; `tramp-smb-maybe-open-connection' lists also the share names.
(tramp-smb-maybe-open-connection v))
;; Loop the listing.
(goto-char (point-min))
(unless (re-search-forward tramp-smb-errors nil t)
(if (re-search-forward tramp-smb-errors nil t)
(tramp-error v 'file-error "%s `%s'" (match-string 0) directory)
(while (not (eobp))
(setq entry (tramp-smb-read-file-entry share))
(forward-line)
@ -1024,11 +1025,9 @@ Result is a list of (LOCALNAME MODE SIZE MONTH DAY TIME YEAR)."
;;
;; If shares are listed, the following format is expected:
;;
;; \s-\{8,8} - leading spaces
;; \S-\(.*\S-\)\s-* - share name, 14 char
;; \s- - space delimeter
;; \S-+\s-* - type, 8 char, "Disk " expected
;; \(\s-\{2,2\}.*\)? - space delimeter, comment
;; Disk| - leading spaces
;; [^|]+| - share name, 14 char
;; .* - comment
;;
;; Entries provided by smbclient DIR aren't fully regular.
;; They should have the format
@ -1086,7 +1085,7 @@ Result is the list (LOCALNAME MODE SIZE MTIME)."
(if (not share)
;; Read share entries.
(when (string-match "^\\s-+\\(\\S-\\(.*\\S-\\)?\\)\\s-+Disk" line)
(when (string-match "^Disk|\\([^|]+\\)|" line)
(setq localname (match-string 1 line)
mode "dr-xr-xr-x"
size 0))
@ -1144,7 +1143,7 @@ Result is the list (LOCALNAME MODE SIZE MTIME)."
(mapconcat
(lambda (x) "") " "
(concat "r" (if (string-match "R" mode) "-" "w") "x"))))
line (substring line 0 -7))
line (substring line 0 -6))
(return))
;; localname.
@ -1164,17 +1163,20 @@ Result is the list (LOCALNAME MODE SIZE MTIME)."
(defun tramp-smb-get-cifs-capabilities (vec)
"Check, whether the SMB server supports POSIX commands."
(with-connection-property
(tramp-get-connection-process vec) "cifs-capabilities"
(when (tramp-smb-send-command vec "posix")
(with-current-buffer (tramp-get-buffer vec)
(goto-char (point-min))
(when (re-search-forward "Server supports CIFS capabilities" nil t)
(member
"pathnames"
(split-string
(buffer-substring
(point) (tramp-compat-line-end-position)) nil t)))))))
;; When we are not logged in yet, we return nil.
(if (let ((p (tramp-get-connection-process vec)))
(and p (processp p) (memq (process-status p) '(run open))))
(with-connection-property
(tramp-get-connection-process vec) "cifs-capabilities"
(when (tramp-smb-send-command vec "posix")
(with-current-buffer (tramp-get-buffer vec)
(goto-char (point-min))
(when (re-search-forward "Server supports CIFS capabilities" nil t)
(member
"pathnames"
(split-string
(buffer-substring
(point) (tramp-compat-line-end-position)) nil t))))))))
;; Connection functions.
@ -1191,7 +1193,7 @@ Returns nil if there has been an error message from smbclient."
"Maybe open a connection to HOST, log in as USER, using `tramp-smb-program'.
Does not do anything if a connection is already open, but re-opens the
connection if a previous connection has died for some reason."
(let* ((share (tramp-smb-get-share (tramp-file-name-localname vec)))
(let* ((share (tramp-smb-get-share vec))
(buf (tramp-get-buffer vec))
(p (get-buffer-process buf)))
@ -1209,15 +1211,20 @@ connection if a previous connection has died for some reason."
(let* ((default-directory (tramp-compat-temporary-file-directory))
(smbclient-version
(shell-command-to-string (concat tramp-smb-program " -V"))))
(unless (string-equal
smbclient-version
(tramp-get-connection-property vec "smbclient-version" ""))
(when (tramp-get-connection-property vec "smbclient-version" nil)
(tramp-flush-directory-property vec "")
(tramp-flush-connection-property vec)
); (setq buf (tramp-get-buffer vec)))
(tramp-set-connection-property
vec "smbclient-version" smbclient-version))))
(tramp-message vec 6 (concat tramp-smb-program " -V"))
(tramp-message vec 6 "\n%s" smbclient-version)
(if (string-match "[ \t\n\r]+\\'" smbclient-version)
(setq smbclient-version
(replace-match "" nil nil smbclient-version)))
(unless
(string-equal
smbclient-version
(tramp-get-connection-property
vec "smbclient-version" smbclient-version))
(tramp-flush-directory-property vec "")
(tramp-flush-connection-property vec))
(tramp-set-connection-property
vec "smbclient-version" smbclient-version)))
;; If too much time has passed since last command was sent, look
;; whether there has been an error message; maybe due to
@ -1256,7 +1263,7 @@ connection if a previous connection has died for some reason."
(if share
(setq args (list (concat "//" real-host "/" share)))
(setq args (list "-L" real-host )))
(setq args (list "-g" "-L" real-host )))
(if (not (zerop (length real-user)))
(setq args (append args (list "-U" real-user)))
@ -1302,16 +1309,15 @@ connection if a previous connection has died for some reason."
(search-forward-regexp
"Domain=\\[[^]]*\\] OS=\\[[^]]*\\] Server=\\[[^]]*\\]" nil t)
(let ((smbserver-version (match-string 0)))
(unless (string-equal
smbserver-version
(tramp-get-connection-property
vec "smbserver-version" ""))
(when (tramp-get-connection-property
vec "smbserver-version" nil)
(tramp-flush-directory-property vec "")
(tramp-flush-connection-property vec))
(tramp-set-connection-property
vec "smbserver-version" smbserver-version))))
(unless
(string-equal
smbserver-version
(tramp-get-connection-property
vec "smbserver-version" smbserver-version))
(tramp-flush-directory-property vec "")
(tramp-flush-connection-property vec))
(tramp-set-connection-property
vec "smbserver-version" smbserver-version)))
;; Set chunksize. Otherwise, `tramp-send-string' might
;; try it itself.