Compare commits

...

78 Commits

Author SHA1 Message Date
Nikolaus Rath a9a1cc0046 Released 2.7 2016-03-01 08:49:53 -08:00
Nikolaus Rath b5983a0ce8 Merge pull request #8 from gapan/master
Restore FAQ file
2016-02-25 08:52:49 -08:00
George Vlahavas adc55c9d2b Restore FAQ file
This commit restores the FAQ file present in sshfs versions up to 2.5.
Changes since the version in the 2.5 release:
 - Remove most wiki markup
 - Edit question about bug reports to point to the Github issue tracker
 - Remove unanswered questions
 - Minor formatting
2016-02-25 15:10:50 +02:00
Nikolaus Rath 451f2075f2 Merge pull request #6 from jmmv/cache-options
Make cache parameters configurable
2016-02-16 10:47:06 -08:00
Julio Merino 391f676705 Explicitly qualify unsigned as unsigned int 2016-02-10 23:18:35 -05:00
Julio Merino c1e799b4da Expose the cache clean interval settings as flags
Allow the user to customize the cache regular and minimum clean intervals
as flags via the new cache_clean_interval and cache_min_clean_interval
options.

While doing this, rename the internal variables and constants to suffix
them with their unit (seconds).
2016-02-10 23:18:35 -05:00
Julio Merino ebfeebd468 Expose the maximum cache size setting as a flag
Allow the user to customize the size of the sshfs cache by adding a new
max_cache_size flag and turning the hardcoded constant into a variable.
2016-02-10 23:18:35 -05:00
Julio Merino d1ddbbcae5 Qualify timeout identifiers with their unit
All timeouts are in seconds, so add a suffix to the identifier names to
clearly denote the unit.
2016-02-10 23:18:35 -05:00
Nikolaus Rath e812e29d39 Merge pull request #5 from jmmv/merge-osxfuse
Merge osxfuse.
2016-02-10 19:53:49 -08:00
Julio Merino 80db43d7dc Improve the sshnodelay hack after osxfuse's merge
Document the strage-looking symbol interposition that is necessary for the
OS X case.

While doing this, homogenize the code to do the real connect call for both
the Linux and OS X cases into a helper function.  This logic is generic
and should not be replicated into various OS-specific cases.
2016-02-08 21:40:30 -05:00
Julio Merino 27e7029148 Unconditionally mlock the password in memory
Revision b4023a19 added an mlock call to ensure the sshfs password is kept
in memory, but did so only for OS X.  This is a good idea in general, so
let's remove the condition.
2016-02-08 21:26:53 -05:00
Julio Merino 30e90ae080 Remove apparently-unnecessary lock
Revision b4023a19dd, which imported the
MacFUSE-specific sshfs fixes into osxfuse-sshfs, added a lock to handle
the refs reference counter of the sshfs_file structure.  However, this
lock was only added for OS X, which is a very strange thing to do.

One may think that this was only because MacFUSE 2.2 had some semantics
that differed from regular FUSE, and that would have been quite stupid
for compatibility reasons.  A few simple tests show no issues after
removing this lock, so let's keep it out for now.  If things break, we
know what to look at.
2016-02-08 21:20:21 -05:00
Julio Merino 9b4ca1aade Avoid using cpp for sshfs.1 generation
Move the logic to determine which values to stick into the manual page
to the configure script and replace the logic to build the sshfs.1
manual page with sed instead of abusing cpp.

I'm not using AC_OUTPUT here because this macro is typically used to
generate support build files.  Final artifacts of the build should, in
general, be built by the Makefile itself.
2016-02-08 21:10:48 -05:00
Julio Merino a03d3eab39 Fix path to compat in -I flag
When defining a -I flag to point into the source directory, we should
prefix the directory with ${srcdir} so that it can be found when the
build is configured to use a build directory that differs from the
source directory.

This fixes "make distcheck".
2016-02-08 20:50:23 -05:00
Julio Merino 665bb97ef6 Document merge of osxfuse's sshfs 2016-02-08 20:50:23 -05:00
Julio Merino b7e8fee81b Sync AUTHORS list after osxfuse-sshfs's merge 2016-02-08 20:50:23 -05:00
Julio Merino 869aa42e97 Remove LIBDIR explicit definition
Makefile.am always sets LIBDIR in CPPFLAGS.  There is no need for sshfs.c
to redefine it to a bogus value when not present, and much less to only
do so for the Darwin case only.
2016-02-08 20:50:23 -05:00
Julio Merino d8230e72ca Drop the cache_enabled hack
cache_enabled leaked the cache.on setting from the cache module abstraction
back into sshfs, and it only did so for the Darwin case.

This hack was being used to avoid calling cache_add_attr and cache_invalidate
when the cache was disabled... but these two functions already do nothing when
in that case: there is no need to do a second check in the caller.
2016-02-08 20:50:22 -05:00
Julio Merino e0025219b3 Drop OSXFUSE_SSHFS_VERSION
Now that we are unifying osxfuse's sshfs into libfuse's version, there
should not be two different version identifiers.  Drop osxfuse's one.
2016-02-08 20:50:22 -05:00
Julio Merino 19ab22abec Improve sshfs.1 manpage generation
* Fix dependencies of the sshfs.1 target to actually specify sshfs.1.in as a
  source.

* Ensure that failures during the generation of sshfs.1 do not result in a
  potentially bogus manpage by first outputting the contents to a temporary
  file unknown to the Makefile rule and then replacing the target file once
  all is known to be OK.

* Use $(AM_V_GEN) in the command to respect automake's silent rules.
2016-02-08 20:50:22 -05:00
Julio Merino 3bf3be3bcd Rename arch to osname
Operating system names are not architectures; therefore, rename the arch
variable to osname to better represent its contents.

While doing this, drop a bunch of unused values from the osname.
2016-02-08 20:46:45 -05:00
Julio Merino ddbe3bee44 Merge remote-tracking branch 'osxfuse/master' into merge-osxfuse
Pull in all changes from osxfuse's fork of sshfs into libfuse's sshfs.
There need not be two different copies of this codebase, particularly
because libfuse's version is already autoconf-ified and can support
multiple platforms.

The merge is mostly clean with just a few manual edits to resolve
conflicts.
2016-02-08 20:46:37 -05:00
Nikolaus Rath b10d21db31 Merge pull request #4 from gala132/patch-1
Fix typo in README.md
2016-02-05 09:25:28 -08:00
gala f7c7713a82 Update README.md
Typo fixed
2016-02-05 09:18:25 +01:00
Nikolaus Rath 3087690aba Released 2.6 2016-01-28 17:16:08 -08:00
Nikolaus Rath 3a60def57e Rename project from sshfs-fuse to sshfs 2016-01-28 17:15:49 -08:00
Nikolaus Rath f5b939d40c Don't attempt to download FAQ for tarball generation. 2016-01-28 17:13:05 -08:00
Nikolaus Rath 9b3fb20112 Added missing ChangeLog entries for 2.4 and 2.5 2016-01-28 17:13:05 -08:00
Nikolaus Rath d20b25cd2d Enable subdir-objects automake option
This is recommended for forward-compatibility.
2016-01-28 17:13:05 -08:00
Nikolaus Rath 055649e2fa Changed Changelog format
Up to now, the Changelog has essentially been a (manually maintained)
copy of the git commit history. This doesn't seem to have any point
other than following the GNU coding standards. I believe it's much
better to use the Changelog to summarize the release-to-release
changes that are most important for users (as was done in the NEWS
file until now).
2016-01-28 17:12:49 -08:00
Nikolaus Rath d18349da3b Removed placeholder README file and switch automake to foreign flavor.
The GNU flavor merely requires to existence of some files (including
README, but we prefer README.md), so there seems to be little point
in using it.
2016-01-28 16:52:50 -08:00
Nikolaus Rath cf10c34573 Updated credits from git. 2016-01-28 16:51:08 -08:00
Nikolaus Rath 008cf7bcf4 Renamed README to README.md for Markdown rendering on Github.
Remaining README file is just to make automake happy.
2015-12-21 19:23:10 -08:00
Miklos Szeredi e4e14109ad sshfs: Increase the maximum length of the password
read from stdin to 1024 characters.

Reported by: Mario A. Valdez-Ramirez.
2015-04-14 11:01:19 +02:00
Qais Patankar 9bcb989454 Fix english 2015-03-16 15:34:34 +01:00
Miklos Szeredi 48122e8043 sshfs-return-the-correct-x_ok-access
sshfs-fuse always returned 0 in access(file, X_OK) calls, causing nautilus
to prompt "Do you want to run "login.defs", or display its contents?" for
text files that were not executable.

Reported by: Alkis Georgopoulos
2014-02-10 14:09:13 +01:00
Benjamin Fleischer f2b17c299b Bump version to 2.5.0 2014-02-03 09:01:38 +01:00
Benjamin Fleischer c3d83ee24b Fix redefinition of struct __local_sem_t 2014-02-03 09:01:26 +01:00
Benjamin Fleischer 1fc97d3f2c Add AC_CANONICAL_TARGET to configure.ac 2014-02-03 09:01:07 +01:00
Benjamin Fleischer b42f84218c Merge tag 'sshfs_2_5'
Conflicts:
	sshfs.c
2014-02-02 23:16:13 +01:00
Miklos Szeredi 6b4415ada4 Released 2.5 2014-01-14 15:23:31 +01:00
Alexander Neumann 6a2d06e36f Implement asynchronous readdir
Accessing directories with many (several thousand) files over sshfs is
slow, because most SFTP server implementations only send a fixed amount
of entries per READDIR command (e.g. OpenSSH SFTP: 100 entries). This
patch implements sending several READDIR commands in parallel, in order
to speed up directory listing in these cases.

An option (sync_readdir) is also added so that users can easily switch
on the old behaviour.

The performance improvement is astonishing. Accessing a directory with
30k files in from a remote server that has a RTT of 15ms via OpenSSH
SFTP:

Synchronous readdir:
 $ ./sshfs -o sync_readdir host:/tmp /mnt/temp
 $ time "ls" -1 /mnt/temp/test | wc -l
 30000
 "ls" -1 /mnt/temp/test  0.07s user 0.01s system 1% cpu 6.928 total

Asynchronous readdir:
 $ ./sshfs host:/tmp /mnt/temp
 $ time "ls" -1 /mnt/temp/test | wc -l
 30000
 "ls" -1 /mnt/temp/test  0.07s user 0.01s system 12% cpu 0.605 total

Accessing a directory with 100k files shows even more dramatic
improvement:

Synchronous readdir:
 $ ./sshfs -o sync_readdir host:/tmp /mnt/temp
 $ time "ls" -1 /mnt/temp/test2 | wc -l
 100000
 "ls" -1 /mnt/temp/test2  0.67s user 1.22s system 0% cpu 3:31.56 total

Asynchronous readdir:
 $ ./sshfs host:/tmp /mnt/temp
 $ time "ls" -1 /mnt/temp/test2 | wc -l
 100000
 "ls" -1 /mnt/temp/test2  0.20s user 0.03s system 14% cpu 1.631 total

This can easily be reproduced by creating a directory on a server and
touching a lot of files in it:
 $ mkdir /tmp/test
 $ cd /tmp/test
 $ for i in $(seq 1 30000); do touch $i; done

Signed-off-by: Alexander Neumann <alexander@bumpern.de>
2014-01-08 16:34:52 +01:00
Miklos Szeredi 334e9e6a27 Add -o disable_hardlink option (debian bug #670926)
Reported by Louis-David Mitterrand
2014-01-08 12:31:18 +01:00
Miklos Szeredi 91c1f2ba9e Map SSH2_FX_FAILURE to ENOTEMPTY for rmdir
Reported by Ross Lagerwall
2014-01-07 18:52:51 +01:00
Benjamin Fleischer 990f30d767 Merge remote-tracking branch 'upstream/master'
Conflicts:
	ChangeLog
	configure.ac
	sshfs.1.in
	sshfs.c
2013-08-03 11:50:50 +02:00
Miklos Szeredi c1d62f2032 fix a typo in man page 2013-04-11 17:58:21 +02:00
Alan Jenkins 61524cd1e8 fix missing newline in manual page 2013-02-18 14:36:51 +01:00
Miklos Szeredi 9f4ba56b52 Add FIXME for deadlock if $PATH contains mountpoint.
Reported by Joachim Kopp
2013-02-05 12:33:36 +01:00
Benjamin Fleischer d04fd55128 Update copyright year in darwin_compat 2013-01-08 15:44:18 +01:00
Benjamin Fleischer 1458193728 Add unnamed semaphore implementation for Mac OS X
In the past we relied on libosxfuse including a working unnamed semaphore
implmentation for Mac OS X. This will not be the case in future releases of
OSXFUSE, therefore we need to add our own implementation.
2013-01-08 15:32:57 +01:00
Miklos Szeredi ce6753c88f When checking root directory use LSTAT not STAT
This prevents I/O error being returned after a successful mount if a symlink is
mounted.

Reported by Bart Friederichs
2012-05-14 16:18:22 +02:00
Benjamin Fleischer 66458931dd Bump version to OSXFUSE SSHFS 2.4.1
The only difference between version 2.4.0 and 2.4.1 is the updated man page to
reflect Darwin/OS X specific changes to upstream SSHFS.
2012-03-11 17:36:01 +01:00
Benjamin Fleischer f4631f0a17 Add Darwin/OS X specific information to man page
* Volumes are unmounted using "umount" not "fusermount"

* idmap=user is the deafault setting on Darwin/OS X
2012-03-11 17:35:25 +01:00
Benjamin Fleischer 3c44e22ddd Bump version to OSXFUSE SSHFS 2.4.0 2012-03-09 22:52:56 +01:00
Benjamin Fleischer b389c66b32 Use "#ifdef __APPLE__" instead of "#if __APPLE__" 2012-03-09 22:51:56 +01:00
Miklos Szeredi f64407d865 Released 2.4 2012-03-09 22:51:49 +01:00
Mike Kelly eb60e2d1a2 make sure idmap files aren't writable by others
otherwise, other local users could change the mapping, and gain access
to things they shouldn't
2012-03-09 22:48:58 +01:00
Chris Wolfe 0d34c7b742 Add slave option to run sftp over stdin and stdout
Add -o slave. This option routes the sftp communication over stdin and stdout,
bypassing SSH and network.
2012-03-09 22:48:58 +01:00
Chris Wolfe ff32332e83 Split fd into separate read and write pipes 2012-03-09 22:48:58 +01:00
Miklos Szeredi c1284b4089 fix unused but set variables
cache.c: In function ‘cache_add_attr’:
cache.c:167:9: warning: variable ‘now’ set but not used [-Wunused-but-set-variable]
cache.c: In function ‘cache_add_dir’:
cache.c:188:9: warning: variable ‘now’ set but not used [-Wunused-but-set-variable]
cache.c: In function ‘cache_add_link’:
cache.c:212:9: warning: variable ‘now’ set but not used [-Wunused-but-set-variable]
2012-03-09 22:48:58 +01:00
Chris Wolfe 0120e6b461 Remove some trailing whitespace.
Verified with `cat -vet` and `grep '\s$'`
2012-03-09 22:48:58 +01:00
Mike Kelly 1ac41d2ae2 skip blank lines 2012-03-09 22:48:58 +01:00
Mike Kelly ea6fa1d7c9 increase portability
getline() isn't widely available yet, use fgets() instead
2012-03-09 22:48:58 +01:00
Mike Kelly 6a954f429c fix typo in error message 2012-03-09 22:44:14 +01:00
Mike Kelly 0e87004ab2 default to erroring if we can't remap a uid/gid
add a '-o nomap=ignore|error' option, which defaults to 'error'
2012-03-09 22:43:58 +01:00
Benjamin Fleischer e6f7fb4e50 Make IDMAP_USER the default option on OS X
UID/GID mapping had been enabled in previous versions of SSHFS for MacFUSE/
OSXFUSE by default. This is the expected behavior.
2012-03-09 22:30:14 +01:00
Mike Kelly a6b6b5c820 Add -o idmap=file, -o uidmap=FILE, -o gidmap=FILE
These options allow you to create a pair of local files, with
username:uid/groupname:gid pairs, one per line. Alternatively, files can
be in standard /etc/passwd / /etc/group format.

The uid/gids are for the remote server, their local counterparts are
looked up with a local getpwnam/getgrnam call. Any stat() calls will
show with the remapped local uid/gid, and any chown() calls will be
remapped back to the remote uid/gid.
2012-01-22 11:19:29 +01:00
Mike Kelly a306a80b6e Fix a possible small memory leak 2012-01-22 11:16:43 +01:00
Mike Kelly bb3ea51117 Fix typo in error message
s/FD_CLOESEC/FD_CLOEXEC/
2012-01-22 11:16:43 +01:00
Miklos Szeredi 20fafed0a4 Fix error handling in sshfs_read_end
Reported by Mike Kelly
2012-01-22 11:16:43 +01:00
Miklos Szeredi 69b2b3cc0e Make chown respect the UID mapping policy
Reported and tested by Vivenzio Pagliari
2012-01-22 11:16:37 +01:00
Miklos Szeredi fa9bfc6d08 Submit max 32k reads and writes to the sftp server
Also don't limit the kernel to 64k reads and writes, rather split into
32k sized chunks and send them to the server all at once.  This is
more efficient and less demanding from the server.

Reported by Ludovic Courtès.  Fix suggested by Niels Möller
2012-01-22 10:45:50 +01:00
Miklos Szeredi 90619fe249 Add locking around modifver and connver 2012-01-22 10:45:36 +01:00
Miklos Szeredi 04a610bad1 Fix double free if reconnection races with request sending
Patch by E. Kuemmerle
2012-01-22 10:45:16 +01:00
Miklos Szeredi d8da0c4ed6 Remove "-oPreferredAuthentications" from ssh options
Remove "-oPreferredAuthentications" from ssh options if the
"password_stdin" option is used.  Reported by E. Kuemmerle
2012-01-22 10:45:06 +01:00
Miklos Szeredi 163683d9ef Add "FIXME: really needs LSETSTAT extension (debian Bug#640038)" 2012-01-22 10:44:55 +01:00
Percy Jahn f2086ccfbc sshfs: fstat workaround
Add "-oworkaround=fstat" for SFTP servers which don't support
the FSTAT message.
2012-01-22 10:44:45 +01:00
Benjamin Fleischer b4023a19dd Apply modified sshfs 2.2 patch from MacFUSE
Based on Amit Singh's work at http://code.google.com/p/macfuse/
2012-01-20 10:02:14 +01:00
15 changed files with 1103 additions and 716 deletions
+1
View File
@@ -20,6 +20,7 @@ Makefile
*.m4
stamp-h*
config.*
sshfs.1
/sshfs
/ltmain.sh
/configure
+29 -1
View File
@@ -1 +1,29 @@
Miklos Szeredi <miklos@szeredi.hu>
Current Maintainer
------------------
Nikolaus Rath <Nikolaus@rath.org>
Past Maintainers
----------------
Miklos Szeredi <miklos@szeredi.hu> (until 12/2015)
Contributors (autogenerated list)
---------------------------------
Alan Jenkins <alan.christopher.jenkins@gmail.com>
Alexander Neumann <alexander@bumpern.de>
Benjamin Fleischer <fleiben@gmail.com>
Chris Wolfe <cwolfe@chromium.org>
gala <gala132@users.noreply.github.com>
George Vlahavas <vlahavas@gmail.com>
Julio Merino <jmmv@google.com>
Julio Merino <jmmv@meroh.net>
Mike Kelly <mike@pair.com>
Miklos Szeredi <miklos@szeredi.hu>
Miklos Szeredi <mszeredi@suse.cz>
Nikolaus Rath <Nikolaus@rath.org>
Percy Jahn <email@percyjahn.de>
Qais Patankar <qaisjp@gmail.com>
+93 -518
View File
@@ -1,573 +1,148 @@
2012-03-08 Miklos Szeredi <miklos@szeredi.hu>
Release 2.6 (2015-03-01)
------------------------
* Released 2.4
* Integrated osxfuse's copy of sshfs, which means that sshfs now works
on OS X out of the box.
* Added -o cache_max_size=N option to let users tune the maximum size of
the cache in number of entries.
* Added -o cache_clean_interval=N and -o cache_min_clean_interval=N
options to let users tune the cleaning behavior of the cache.
2012-03-08 Miklos Szeredi <miklos@szeredi.hu>
Release 2.6 (2015-01-28)
------------------------
* Make sure idmap files aren't writable by others otherwise, other
local users could change the mapping, and gain access to things
they shouldn't. Patch by Mike Kelly
* New maintainer (Nikolaus Rath <Nikolaus@rath.org>)
2012-02-08 Chris Wolfe <cwolfe@chromium.org>
Release 2.5 (2014-01-14)
------------------------
* Add -o slave. This option routes the sftp communication over stdin
and stdout, bypassing SSH and network.
* Some performance improvements for large directories.
* New `disable_hardlink` option.
* Various small bugfixes.
2011-12-16 Mike Kelly <mike@pair.com>
Release 2.4 (2012-03-08)
------------------------
* Add -o idmap=file, -o uidmap=FILE, -o gidmap=FILE. These options
allow you to create a pair of local files, similar to /etc/passwd or
/etc/group files from the remote server, and use those to remap all
the given UIDs/GIDs.
* New `slave` option.
* New `idmap`, `uidmap` and `gidmap` options.
* Various small bugfixes.
2011-11-25 Miklos Szeredi <miklos@szeredi.hu>
Release 2.3 (2011-07-01)
------------------------
* Make chown respect the UID mapping policy. Reported and tested
by Vivenzio Pagliari
* Support hard link creation if server is OpenSSH 5.7 or later
* Small improvements and bug fixes
* Check mount point and options before connecting to ssh server
* New 'delay_connect' option
2011-11-16 Miklos Szeredi <miklos@szeredi.hu>
Release 2.2 (2008-10-20)
------------------------
* Submit max 32k reads and writes to the sftp server. Also don't
limit the kernel to 64k reads and writes, rather split into 32k
sized chunks and send them to the server all at once. This is
more efficient and less demanding from the server. Reported by
Ludovic Courtès. Fix suggested by Niels Möller
* Handle numerical IPv6 addresses enclosed in square brackets
* Handle commas in usernames
2011-11-14 Miklos Szeredi <miklos@szeredi.hu>
Release 2.1 (2008-07-11)
------------------------
* Fix double free if reconnection races with request sending.
Patch by E. Kuemmerle
* Small improvements and bug fixes
* Add locking around modifver and connver
Release 2.0 (2008-04-23)
------------------------
2011-10-21 Miklos Szeredi <miklos@szeredi.hu>
* Support password authentication with pam_mount
* Remove "-oPreferredAuthentications" from ssh options if the
"password_stdin" option is used. Reported by E. Kuemmerle
* Support atomic renames if server is OpenSSH 4.9 or later
2011-08-24 Miklos Szeredi <miklos@szeredi.hu>
* Support getting disk usage if server is OpenSSH 5.1 or later
* Add "-oworkaround=fstat" for SFTP servers which don't support
the FSTAT message. Patch by: Percy Jahn
* Small enhancements and bug fixes
2011-07-01 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.9
------------------
* Released 2.3
* Fix a serious bug, that could result in sshfs hanging, crashing, or
reporting out-of-memory
2011-07-01 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.8
------------------
* Add hard link operation. Works if the server supports the
"hardlink@openssh.com" protocol extension.
* Bug fixes
2011-03-25 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.7
------------------
* Fix possible deadlock on reconnection. Reported by Florian
Zumbiehl
* Tolerate servers which print a banner on login
2011-01-25 Miklos Szeredi <miklos@szeredi.hu>
* Small improvements
* Fix cleanup when ssh connection is terminated. This prevents
sshfs hanging when the server is rebooted, for example.
What is new in 1.6
------------------
2010-03-16 Miklos Szeredi <miklos@szeredi.hu>
* Workaround for missing truncate operation on old sftp servers
* Set FD_CLOEXEC on fuse device. This prevents deadlocks that
happen in some circumstances (bugzilla.kernel.org #12864).
Reported by Tim Connors
* Bug fixes
2009-07-15 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.5
------------------
* Check mountpoint and fuse options before starting an ssh
session (debian bug #535333). This is only supported if compiled
against libfuse-2.6 or later. Reported by Greg Kochanski
* Improvements to read performance. Now both read and write
throughput should be very close to 'scp'
* Check that the remote path specified refers to the same type of
file as the mountpoint, i.e. both are directories or both are
non-directories (debian bug #535343). Reported by Greg Kochanski
* If used with FUSE 2.6.0 or later, then perform better data caching.
This should show dramatic speed improvements when a file is opened
more than once
* Allow mounting a single non-directory from the server
* Bug fixes
2009-07-15 Sebastian Dransfeld <sebastid@tango.flipp.net>
What is new in 1.4
------------------
* Add option 'delay_connect': This will always create the sshfs mount,
even if the connection to the server can't be established.
* Updated to version 25 of libfuse API
2009-01-27 Miklos Szeredi <miklos@szeredi.hu>
* This means that the 'cp' of readonly file to sshfs bug is finally
solved (as long as using libfuse 2.5.0 or later *and* Linux 2.6.15
or later)
* Print usage information and version to stdout, not stderr.
Libfuse also needs to be fixed up. Reported by Kārlis Repsons
* Sshfs now works on FreeBSD
2008-10-20 Miklos Szeredi <miklos@szeredi.hu>
* Added option to "transform" absolute symbolic links
* Released 2.2
What is new in 1.3
------------------
2008-10-20 Miklos Szeredi <miklos@szeredi.hu>
* Add workaround for failure to rename to an existing file
* Escape commas in fsname option if libfuse supports it
* Simple user ID mapping
2008-10-08 Miklos Szeredi <miklos@szeredi.hu>
* Estimate disk usage of files based on size
* Handle numerical IPv6 addresses enclosed in square brackets.
Reported by Andre-John Mas
* Report "infinite" disk space
* Fix error if username contains a comma character. Reported by
Yang Zhang
* Bug fixes
* Fix harmless glib assertations with "cache=no"
What is new in 1.2
------------------
2008-07-11 Miklos Szeredi <miklos@szeredi.hu>
* Better compatibility with different sftp servers
* Released 2.1
* Automatic reconnect (optional)
2008-07-11 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.1
------------------
* Fix statvfs extension to match the current protocol in
opensshfs
* Performance improvements:
* Check version numbers of extensions, so such changes wouldn't
cause stupid behavior
- directory content caching
2008-06-24 Miklos Szeredi <miklos@szeredi.hu>
- symlink caching
* Add '-F' option to specify the ssh config file. Patch by Pat
Pascal.
- asynchronous writeback
2008-05-06 Miklos Szeredi <miklos@szeredi.hu>
- readahead
* Fix bug in caching which could cause file corruption for append
mode writes. Reported by Jose Alonso
* Fixed '-p' option
2008-05-05 Miklos Szeredi <miklos@szeredi.hu>
What is new in 1.0
------------------
* Fix compile on OS X. Original patch from Michael G Schwern
* Fix compile on Solaris. Reported by Jean-Jacques Sarton
2008-04-23 Miklos Szeredi <miklos@szeredi.hu>
* Released 2.0
2008-04-23 Miklos Szeredi <miklos@szeredi.hu>
* Add manual page. Written by Bartosz Fenski
2008-04-22 Miklos Szeredi <miklos@szeredi.hu>
* Add missing ssh options: ControlMaster, ControlPath,
KbdInteractiveAuthentication, KbdInteractiveDevices, LocalCommand,
RekeyLimit (Debian bug #430225).
* Allow the '-ossh_command=CMD' command to contain parameters.
Escape charater is backslash.
* Limit write requests to 64kB.
* Support "statvfs@openssh.com" extension, which will be available
in OpenSSH 5.1.
2008-04-21 Miklos Szeredi <miklos@szeredi.hu>
* Fix incorrect disk usage reported by 'du' for files of size 4GB
or above. Reported by Christian Boltz.
2008-04-16 Miklos Szeredi <miklos@szeredi.hu>
* If debugging is enabled, print some statistics at exit about the
number of bytes transferred, etc..
2008-03-31 Miklos Szeredi <miklos@szeredi.hu>
* Support "posix-rename@openssh.com" extension available in
OpenSSH 4.9. This allows rename to be atomic even when target
file or directory exists. If available, the extension will be
used instead of the rename operation in the original protocol and
the "-oworkaround=rename" option will be ignored.
2008-03-28 Miklos Szeredi <miklos@szeredi.hu>
* Add support for password authentication with pam_mount.
Original patch and help with testing: John S. Skogtvedt
2008-03-03 Miklos Szeredi <miklos@szeredi.hu>
* Fix ssh debug only appearing if "-d" is used. Reported by
Michael Gorbach
2008-01-03 Miklos Szeredi <miklos@szeredi.hu>
* Fix condition for building of sshnodelay.so
2007-12-17 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.9
2007-12-12 Miklos Szeredi <miklos@szeredi.hu>
* Fix checking for fuse_opt_parse in configure
2007-12-11 Miklos Szeredi <miklos@szeredi.hu>
* Fill in st_ctime attribute with st_mtime, instead of leaving it
zero
* Check for OpenSSH version >= 4.4, and if found, don't build the
sshnodelay.so workaround
2007-12-10 Miklos Szeredi <miklos@szeredi.hu>
* Fix crash on writing files, caused by missing locking around
sshfs_file_get()
* Don't time requests when not debugging
* Add subtype support with libfuse >= 2.7.0
* Abort on allocation failure instead of exit
* Correctly show default of nodelaysrv workaround in help message
2007-05-16 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.8
2007-05-15 Miklos Szeredi <miklos@szeredi.hu>
* Add needed g_thread_init() to fix rare crashes. Reported by
Dimitrios Apostolou
* Fix memory leak in sshfs_open_common()
2007-04-18 Miklos Szeredi <miklos@szeredi.hu>
* Fix crash within gdb, caused by sem_wait() returning with an
error on interrupt. Reported by Dimitrios Apostolou
* Fix spurious cache entries remaining after renaming a directory
2007-02-28 Miklos Szeredi <miklos@szeredi.hu>
* Don't set DISPLAY environment variable to "", because it breaks
ssh-askpass. Make nodelaysrv_workaround default to off, because
with this change it may have security implications.
2007-02-19 Miklos Szeredi <miklos@szeredi.hu>
* OpenSSH sftp-server can read requests faster, than it processes
them, when it's buffer is full it aborts. This can happen on a
large upload to a slow server. Work around this by limiting the
total size of outstanding reqests. Debian bug #365541. Tracked
down by Thue Janus Kristensen
* Add --disable-sshnodelay configure option. The sshnodelay.so
hack shouldnt be needed with OpenSSH client versions >= 4.3
2006-12-20 Miklos Szeredi <miklos@szeredi.hu>
* Work around write performace issues due to missing TCP_NODELAY
in sshd. Reported by Justin Searle
2006-11-10 Miklos Szeredi <miklos@szeredi.hu>
* Fix bug which ommitted directory entries for symlinks with the
-ofollow_symlinks option. Bug reported by Mikael Ståldal
2006-09-29 Miklos Szeredi <miklos@szeredi.hu>
* Fix segfault if there are outstanding writes to the server after
release on the file descriptor. This only happened on FreeBSD.
Reported by Andriy Gapon
2006-08-18 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.7
2006-08-17 Miklos Szeredi <miklos@szeredi.hu>
* Cosmetics on bogus statfs numbers
2006-08-16 Miklos Szeredi <miklos@szeredi.hu>
* Add option 'follow_symlinks' to resolve symlinks on the server.
* On setups where the login shell prints a banner, the sftp
protocol was confused, and bailed out with "reply len too large:
...". So iterate over any rubbish read immediately after login
until a valid reply is found.
* Check remote directory for existence before mounting. Closes
Ubuntu bug #46633
2006-03-10 Miklos Szeredi <miklos@szeredi.hu>
* Use socketpair() instead of pipe() for communication between ssh
and sshfs. Patch from Csaba Henk
* Update to FUSE interface version 26
2006-03-09 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.6
2006-03-09 Miklos Szeredi <miklos@szeredi.hu>
* Fix segfault if remote host is down and reconnection is enabled
2006-03-08 Miklos Szeredi <miklos@szeredi.hu>
* Fix bug in symlink transformation. Reported by Ralf Hoffmann
2006-02-24 Miklos Szeredi <miklos@szeredi.hu>
* Add workaround for broken truncate on old sftp servers. Can be
enabled with '-oworkaround=truncate'. Patch from Joseph M Link
2006-02-23 Miklos Szeredi <miklos@szeredi.hu>
* Avoid double memcpy on writes. Patch by Joseph M Link
* More memory copy avoidance
2006-02-22 Miklos Szeredi <miklos@szeredi.hu>
* Add -fPIC to the comile flags of sshnodelay.so. Reported by
Anthony Kolasny
2006-02-20 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.5
2006-02-19 Miklos Szeredi <miklos@szeredi.hu>
* Fix compilation with old FUSE versions. Report by Kurt George
Gjerde
2006-02-16 Miklos Szeredi <miklos@szeredi.hu>
* Block TERM/INT/HUP/QUIT signals in sshfs reading thread, so they
will always be received by the FUSE main thread. Fixes the
"double ^C" problem seen on FreeBSD.
* Use 'auto_cache' option if available, so that file cache is not
thrown away on each open. This should make repeated reading of a
file much much faster.
2006-01-31 Miklos Szeredi <miklos@szeredi.hu>
* Fix problems with nodelay workaround on FreeBSD.
2006-01-30 Miklos Szeredi <miklos@szeredi.hu>
* Fix data consitency bug if readahead is enabled and writes are
intermixed with reads. Solution is far from optimal, since it
will prevent readahead in the above situation. If used with FUSE
>= 2.6.0 with Linux-2.6.X, readahead will be done by the kernel,
and hence there will be no performance penalty. Bug reported and
test program written by Wolfgang Köbler. Further testing on
FreeBSD by Csaba Henk
2006-01-29 Miklos Szeredi <miklos@szeredi.hu>
* Add '-olarge_read' option for Linux-2.4.*. This should
generally improve download performance
2006-01-27 Miklos Szeredi <miklos@szeredi.hu>
* Add workaround (enabled by default) for ssh clients not setting
TCP_NODELAY on the network connection. Currently this is all
known versions of openssh. This may improve download speed in
some circumstances
* Make it possible to idividually disable workarounds with a "no"
prefix
* Change '-otransform_symlinks' not to prefix with the mountpoint
(which is fragile wrt. moving/binding the mount). Rather convert
absolute symlinks to relative if possible. Does not yet work if
base path is itself relative
2006-01-25 Miklos Szeredi <miklos@szeredi.hu>
* Use TCP_NODELAY socket option for direct connection. This may
improve download speed in some circumstances
2006-01-20 Miklos Szeredi <miklos@szeredi.hu>
* Update to fuse API 2.6
* Don't do readahead in sshfs if it's done in kernel
2006-01-14 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.4
2006-01-09 Miklos Szeredi <miklos@szeredi.hu>
* Added 'transform_symlinks' option to "fix-up" absolute symlinks.
Patch by Paul Jarc
* Add option parsing implementation, so linking with older than
2.5.0 libfuse still works.
2005-12-09 Miklos Szeredi <miklos@szeredi.hu>
* Use new option parsing interface of FUSE
2005-11-28 Miklos Szeredi <miklos@szeredi.hu>
* Set statvfs::f_frsize
2005-11-23 Miklos Szeredi <miklos@szeredi.hu>
* Fix warnings on 64bit systems. Reported by D. R. Evans
2005-11-16 Miklos Szeredi <miklos@szeredi.hu>
* Replace EPROTO with the more portable EIO
* Fix bug in option parsing. Reported by Csaba Henk
2005-10-29 Miklos Szeredi <miklos@szeredi.hu>
* Use FUSE version 25 if available
* Add <sys/socket.h> include. Reported by Csaba Henk
2005-10-29 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.3
2005-10-28 Miklos Szeredi <miklos@szeredi.hu>
* Add atomic create+open and ftruncate operation. This should fix
issues with 'cp' and other programs failing with "Permission
denied". To be effective, needs FUSE version 2.5 and kernel
version 2.6.15 (just a guess, since neither of them is released
yet).
2005-10-27 Miklos Szeredi <miklos@szeredi.hu>
* Add support for SSH protocol version 1. Bug reported by Miklos
Bagi Jr.
2005-10-26 Miklos Szeredi <miklos@szeredi.hu>
* Fix typo (ConnectTimeout -> ConnectionTimeout) in ssh options.
Bug reported by Miklos Bagi Jr.
2005-10-19 Miklos Szeredi <miklos@szeredi.hu>
* GNOME Nautilus fails to copy file to sshfs filesystem, because
FUSE returns zero free space. So instead return huge (999999999
kbytes) amount of free space, yet it should be obvious that the
number is artificial. Bug report by Peter Kronheimer
2005-10-18 Miklos Szeredi <miklos@szeredi.hu>
* Add remote uid detection and translation ('idmap=user' option).
Idea and implementation details worked out by Jean-Marc Valin
2005-10-17 Miklos Szeredi <miklos@szeredi.hu>
* Add one more missing lock.
* Add workaround for failure to rename to an existing file. Based
on patch by Michael Best
2005-10-15 Miklos Szeredi <miklos@szeredi.hu>
* Protect request ID allocation with mutex. Bug report by Tvrtko
Ursulin
2005-08-17 Miklos Szeredi <miklos@szeredi.hu>
* Try to calculate approximate disk usage of files from their
size, so that 'du' returns meaningful results. Problem reported
by Bernd Amend.
2005-08-15 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.2
2005-08-13 Miklos Szeredi <miklos@szeredi.hu>
* Add 'reconnect' option, which tries to reconnect to the server
when the connection is broken. If a password is required for
connection, it is recommended that you install ssh-askpass, and
set the SSH_ASKPASS environment variable (see 'man ssh' for more
details).
2005-05-05 Miklos Szeredi <miklos@szeredi.hu>
* Work around missing truncate() support in some older sftp
servers (only works for zero size truncate). Thanks to Eduard
Czimbalmos for the bug report and help with testing
2005-04-13 Miklos Szeredi <miklos@szeredi.hu>
* Fix compilation with gcc-2.95. Reported by David A. Gershman
2005-03-08 Miklos Szeredi <miklos@szeredi.hu>
* Make it work on server version 2 (e.g. Sun_SSH_1.0.1). Report
and testing by Pieter J. Kersten
2005-03-04 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.1
2005-03-03 Miklos Szeredi <miklos@szeredi.hu>
* Slightly optimize readahead. Still not clever enough to always
keep the pipe filled.
* Add 'sshfs_debug' option
2005-02-17 Miklos Szeredi <miklos@szeredi.hu>
* Parse 'max_read' mount option and if smaller than 65536 forward
to FUSE
2005-02-16 Miklos Szeredi <miklos@szeredi.hu>
* Added simple readahead (big performance gain in case of
sequential read pattern). Can be disabled with '-o no_readahead'
2005-02-14 Miklos Szeredi <miklos@szeredi.hu>
* Added asynchronous writeback (big performance gain) and made
this the default. Can be disabled with '-o sshfs_sync'
2005-02-09 Miklos Szeredi <miklos@szeredi.hu>
* Added option to start arbitary command instead of 'ssh'
* Re-added '-p PORT' as a convenience option, also '-C' works as
in ssh.
2005-02-08 Miklos Szeredi <miklos@szeredi.hu>
* Add caching of symlinks
* Add support for many ssh options to be passed to ssh
* Port number can now actually be specified with "-o port=PORT",
bug spotted by Andrew Ukrainec
2005-02-07 Miklos Szeredi <miklos@szeredi.hu>
* Separate attribute caching to a separate layer
* Add caching of directory contents
2005-02-03 Miklos Szeredi <miklos@szeredi.hu>
Fix PKG_CONFIG_PATH setting in configure.ac (reported by Alpar
Juttner)
2005-01-09 Miklos Szeredi <miklos@szeredi.hu>
* Released 1.0
2004-12-04 Miklos Szeredi <miklos@szeredi.hu>
* Started ChangeLog
* Initial release
+263
View File
@@ -0,0 +1,263 @@
SSHFS FAQ
=========
1. I've found a bug and there's no solution in this FAQ, what
should I do?
2. Advantage of sshfs over NFS and Samba
3. Create the device node
4. mv fails with "Operation not permitted"
5. cvs fails with "cvs [status aborted]: cannot get working
directory: No such file or directory" in a sshfs mounted directory
6. Changes on the server are not immediately visible in the
mounted directory.
7. Configuring the ssh connection
8. What are the no_readahead and sshfs_sync options for?
9. Why does df return strange values on partitions mounted via
sshfs?
10. How do I specify the remote mount point (since the example
defaults to the home directory)
11. sshfs hangs after a while
12. Following symlinks on the server side
13. Making absolute symlinks work
14. Mounting as root
15. Exporting via NFS
16. Automatical mounting using /etc/fstab
17. Why does SVN (etc...) fail with permission denied?
18. Why does SVN (etc...) fail to rename files?
19. Is there some neat way to do it in reverse?
20. Might it be reasonable to disallow loops?
21. How to mount through an intermediary ssh server, eg:
localhost -> A -> B; mount B from localhost
22. Alternative Solution
23. I seem to have successfully mounted a remote directory, but
performing an `ls -l` on the directory above the mount point shows
the mount point's attributes as `? ? ? ? ? ?`. Nothing shows up in
the directory either. What am I doing wrong?
--------------------------------------------------------------------------
1. I've found a bug and there's no solution in this FAQ, what should I do?
Please report the bug in the Github issue tracker:
https://github.com/libfuse/sshfs/issues
Also logs with debugging output can be useful for diagnosing the
problem. Try running sshfs with the following options:
sshfs -odebug,sshfs_debug,loglevel=debug ...
Doing strace on the application which fails may also sometimes help:
strace -f -o /tmp/strace application args ...
Note that large messages (over 40k) will be rejected from the mailing
list. So try to keep the logs as short as possible.
2. Advantage of sshfs over NFS and Samba
Users can mount remote resources they already have ssh access to,
without requiring the remote machine to export the resource.
The remote resource can be mounted when it is needed in a location
that is convenient for the user at that time, without needing to rely
on a central, root-controlled file system table.
Automatic mounting, if desired, can be added to a shell script such as
.bashrc (provided authentication is done using RSA/DSA keys).
Resources can be mounted over slow and unreliable (distant)
connections.
3. Create the device node
If you don't use udev, you may get this error message:
fusermount: failed to open /dev/fuse: No such device or address
Before loading the fuse kernel module, create the device node
manually:
mknod -m 666 /dev/fuse c 10 229
4. mv fails with "Operation not permitted".
Use -o workaround=rename (requires sshfs version >= 1.3).
5. cvs fails with "cvs status aborted?: cannot get working directory: No such
file or directory" in a sshfs mounted directory
Use the -oreaddir_ino option. Example:
sshfs -oreaddir_ino hostname:remote_dir mount_point
6. Changes on the server are not immediately visible in the mounted directory.
By default, sshfs caches things for 20 seconds, use -o cache_timeout=N
to change the default cache timeout (in seconds) or -o cache=no for
disabling the cache.
You can also control cache timeouts for directory listing etc with
-o cache_stat_timeout=N,
-o cache_dir_timout=N, and
-o cache_link_timout=N.
7. Configuring the ssh connection
In addition to flags like -C, -p, and -o SSHOPT...=, you may find it
easier to edit your /.ssh/config file. You can add an entry with any
customization you want, test it with ssh, and finally use it with
sshfs. As a bonus, you get a short mnemonic for your configuration.
8. What are the no_readahead and sshfs_sync options for?
These disable read and write optimizations respectively. They don't
really make sense unless you're doing something special.
9. Why does df return strange values on partitions mounted via sshfs?
Because the SFTP protocol doesn't have a statfs operation this is
currently not possible to display proper usage on remote partition.
10. How do I specfy the remote mount point (since the example defaults to the
home directory)
The example shows:
sshfs hostname: mountpoint
To specify a remote mount point use:
sshfs hostname:remotemountpoint mountpoint
This might be obvious to others, but I ended up looking up the
interface to sftp to see if I could learn how to specify the remote
mount point, then thought about the way that scp specifies the remote
directory, and it worked.
11. sshfs hangs after a while
Mounting works fine, I can use the files in Mountpoint as good as any
other files on my system, but after bit of time, changing nothing on
the remote files sshfs crashes. This means, I can not cd into the
Mountpoint (xterm hangs, nautilus hangs... every program trying to
access the Mountpoint gets stuck, and won't return).
Solution: add
ServerAliveInterval 15
in your .ssh/config (or use -o ServerAliveInterval=15 on the sshfs
command line but I did not test that solution). This will force the
ssh connection to stay alive even if you have no activity.
12. Following symlinks on the server side
The -o follow_symlinks option will enable this.
13. Making absolute symlinks work
Use the -o transform_symlinks option, which will transform absolute
symlinks (ones which point somewhere inside the mount) into relative
ones.
14. Mounting as root
Generally it's not possible to use an sshfs mount as a "real"
filesystem shared between multiple users. Some of this functionality
can be enabled with the -o allow_other and -o default_permissions
options, but files will not be created with the correct ownership,
etc...
15. Exporting via NFS
Use the userspace NFS daemon http://sourceforge.net/projects/unfs
16. Automatical mounting using /etc/fstab
A line in /etc/fstab has the following format:
sshfs#USERNAME@REMOTE_HOST:REMOTE_PATH MOUNT_POINT fuse SSHFS_OPTIONS 0 0
eg.
sshfs#guest@guest.login.com:data /mnt/guest fuse \
uid=1003,gid=100,umask=0,allow_other 0 0
17. Why does SVN (etc...) fail with permission denied?
This is a bug that happens when an application creates a read-only
file opened for writing (e.g. open("foo", O_WRONLY|O_CREAT, 0444))
It has been fixed in sshfs version 1.3, but also requires FUSE version
>=2.5.X and Linux kernel version >=2.6.15.
18. Why does SVN (etc...) fail to rename files?
$ svn co svn://anonsvn.kde.org/home/kde/trunk/KDE/kdelibs
svn: Can't move 'kdelibs/.svn/tmp/entries' to 'kdelibs/.svn/entries':
Operation not permitted
The reason is that SFTP protocol version 3 (which is implemented by
OpenSSH's sftp-server) defines the rename operation slightly
differently than POSIX. The difference is that renaming to an existing
file or directory will fail instead of atomically replacing the old
file.
The -o workaround=rename option will try to emulate POSIX rename
semantics, but it cannot guarantee atomicity. In most of the cases
this doesn't matter, and things will work fine with this option.
19. Is there some neat way to do it in reverse?
You want to mount a USB thumb drive onto a file server that is rather
remote.
Assuming this is difficult because the laptop with the thumb drive is
sitting behind NAT, firewalls, etc. then you need to create a
port-forward:
client$ ssh -R 2222:localhost:22 server
server$ sshfs -p 2222 localhost:/media/usb1 myusb1
(Now, is there is there a smarter way that does not involve port
opening login permissions in an undesireable direction?)
20. Might it be reasonable to disallow loops?
sshfs localhost:/mnt /mnt
This seems to produce undesirable results. --JoshuaRodman
21. How to mount through an intermediary ssh server, eg: localhost -> A -> B;
mount B from localhost
Start by mounting the folder you need that is on "a" to a folder on
"b" then mount the new folder that is on "a" to a folder on localhost.
IE: (These are NOT real commands, but a sequence of steps.
A mounts B:/home/x on /mnt/Bx
localhost mounts A:/mnt/Bx on ~/mydir
22. Alternative Solution:
1) Create a shell script to wrap the tunneling of one ssh command over
another,
$ cat >Atunnel <<EOF
#!/bin/bash
ssh -q A ssh -q "$@"
EOF
$ chmod u+x Atunnel
N.B. make sure to put this somewhere on your path. 2) sshfs mount as
normal but using this script as the ssh command.
$ sshfs -o ssh_command='Atunnel' B: ~/mydir
23. I seem to have successfully mounted a remote directory, but performing an
`ls -l` on the directory above the mount point shows the mount point's
attributes as `? ? ? ? ? ?`. Nothing shows up in the directory either. What
am I doing wrong?
You probably specified a remote path with the tilde (~) in it. This
doesn't seem to work. Instead, specify an absolute remote path:
sshfs username@remote.host:/home/username/whatever my/mount
What options do i use to make playing media files (music) over sshfs more
efficient?
MacFUSE doesn't seem to let me move files from one directory to another. It
first asks for my local user password (i.e. the password on my Macbook Pro)
and then produces the error message "The operation cannot be completed
because one or more required items cannot be found. (Error code -120).
+14 -3
View File
@@ -6,16 +6,27 @@ sshfs_SOURCES = sshfs.c cache.c cache.h
if FUSE_OPT_COMPAT
sshfs_SOURCES += compat/fuse_opt.c compat/fuse_opt.h
endif
if DARWIN_COMPAT
sshfs_SOURCES += compat/darwin_compat.c compat/darwin_compat.h
endif
sshfs_LDADD = $(SSHFS_LIBS)
sshfs_CFLAGS = $(SSHFS_CFLAGS)
sshfs_CPPFLAGS = -D_REENTRANT -DFUSE_USE_VERSION=26 -DLIBDIR=\"$(libdir)\"
sshfs_CPPFLAGS = -D_REENTRANT -DFUSE_USE_VERSION=26 -DLIBDIR=\"$(libdir)\" \
-DIDMAP_DEFAULT="\"$(IDMAP_DEFAULT)\""
EXTRA_DIST = sshnodelay.c FAQ.txt
CLEANFILES = sshnodelay.so
EXTRA_DIST = sshnodelay.c sshfs.1.in
CLEANFILES = sshnodelay.so sshfs.1 sshfs.1.tmp
dist_man_MANS = sshfs.1
sshfs.1: sshfs.1.in
$(AM_V_GEN)sed \
-e 's,__IDMAP_DEFAULT__,$(IDMAP_DEFAULT),g' \
-e 's,__UNMOUNT_COMMAND__,$(UNMOUNT_COMMAND),g' \
<sshfs.1.in >sshfs.1.tmp || exit 1; \
mv sshfs.1.tmp sshfs.1
if SSH_NODELAY_SO
all-local: sshnodelay.so
-112
View File
@@ -1,112 +0,0 @@
What is new in 2.1, 2.2 and 2.3
-------------------------------
* Support hard link creation if server is OpenSSH 5.7 or later
* Check mount point and options before connecting to ssh server
* Handle commas in usernames
* Small improvements and bug fixes
What is new in 2.0
------------------
* Support password authentication with pam_mount
* Support atomic renames if server is OpenSSH 4.9 or later
* Support getting disk usage if server is OpenSSH 5.1 or later
* Small enhancements and bug fixes
What is new in 1.9
------------------
* Fix a serious bug, that could result in sshfs hanging, crashing, or
reporting out-of-memory
What is new in 1.8
------------------
* Bug fixes
What is new in 1.7
------------------
* Tolerate servers which print a banner on login
* Small improvements
What is new in 1.6
------------------
* Workaround for missing truncate operation on old sftp servers
* Bug fixes
What is new in 1.5
------------------
* Improvements to read performance. Now both read and write
throughput should be very close to 'scp'
* If used with FUSE 2.6.0 or later, then perform better data caching.
This should show dramatic speed improvements when a file is opened
more than once
* Bug fixes
What is new in 1.4
------------------
* Updated to version 25 of libfuse API
* This means that the 'cp' of readonly file to sshfs bug is finally
solved (as long as using libfuse 2.5.0 or later *and* Linux 2.6.15
or later)
* Sshfs now works on FreeBSD
* Added option to "transform" absolute symbolic links
What is new in 1.3
------------------
* Add workaround for failure to rename to an existing file
* Simple user ID mapping
* Estimate disk usage of files based on size
* Report "infinite" disk space
* Bug fixes
What is new in 1.2
------------------
* Better compatibility with different sftp servers
* Automatic reconnect (optional)
What is new in 1.1
------------------
* Performance improvements:
- directory content caching
- symlink caching
- asynchronous writeback
- readahead
* Fixed '-p' option
What is new in 1.0
------------------
* Initial release
+11 -13
View File
@@ -26,8 +26,7 @@ Latest version
==============
The latest version and more information can be found on
http://fuse.sourceforge.net/sshfs.html
http://github.com/libfuse/sshfs
How to mount a filesystem
@@ -35,7 +34,7 @@ How to mount a filesystem
Once sshfs is installed (see next section) running it is very simple:
sshfs hostname: mountpoint
sshfs hostname: mountpoint
Note, that it's recommended to run it as user, not as root. For this
to work the mountpoint must be owned by the user. If the username is
@@ -47,28 +46,27 @@ is the home directory.
Also many ssh options can be specified (see the manual pages for
sftp(1) and ssh_config(5)), including the remote port number
('-oport=PORT')
(`-oport=PORT`)
To unmount the filesystem:
fusermount -u moutpoint
fusermount -u mountpoint
Installing
==========
First you need to download FUSE 2.2 or later from:
http://fuse.sourceforge.net
First you need to download FUSE 2.2 or later from
http://github.com/libfuse/libfuse.
You also need to install the devel package for glib2.0. After
installing FUSE, compile sshfs the usual way:
./configure
make
make install (as root)
./configure
make
make install (as root)
And you are ready to go.
If checking out from CVS for the first time also do 'autoreconf -i'
before doing './configure'.
If checking out from git for the first time also do `autoreconf -i`
before doing `./configure`.
+34 -22
View File
@@ -14,16 +14,19 @@
#include <glib.h>
#include <pthread.h>
#define DEFAULT_CACHE_TIMEOUT 20
#define MAX_CACHE_SIZE 10000
#define MIN_CACHE_CLEAN_INTERVAL 5
#define CACHE_CLEAN_INTERVAL 60
#define DEFAULT_CACHE_TIMEOUT_SECS 20
#define DEFAULT_MAX_CACHE_SIZE 10000
#define DEFAULT_CACHE_CLEAN_INTERVAL_SECS 60
#define DEFAULT_MIN_CACHE_CLEAN_INTERVAL_SECS 5
struct cache {
int on;
unsigned stat_timeout;
unsigned dir_timeout;
unsigned link_timeout;
unsigned int stat_timeout_secs;
unsigned int dir_timeout_secs;
unsigned int link_timeout_secs;
unsigned int max_size;
unsigned int clean_interval_secs;
unsigned int min_clean_interval_secs;
struct fuse_cache_operations *next_oper;
GHashTable *table;
pthread_mutex_t lock;
@@ -70,9 +73,9 @@ static int cache_clean_entry(void *key_, struct node *node, time_t *now)
static void cache_clean(void)
{
time_t now = time(NULL);
if (now > cache.last_cleaned + MIN_CACHE_CLEAN_INTERVAL &&
(g_hash_table_size(cache.table) > MAX_CACHE_SIZE ||
now > cache.last_cleaned + CACHE_CLEAN_INTERVAL)) {
if (now > cache.last_cleaned + cache.min_clean_interval_secs &&
(g_hash_table_size(cache.table) > cache.max_size ||
now > cache.last_cleaned + cache.clean_interval_secs)) {
g_hash_table_foreach_remove(cache.table,
(GHRFunc) cache_clean_entry, &now);
cache.last_cleaned = now;
@@ -172,7 +175,7 @@ void cache_add_attr(const char *path, const struct stat *stbuf, uint64_t wrctr)
if (wrctr == cache.write_ctr) {
node = cache_get(path);
node->stat = *stbuf;
node->stat_valid = time(NULL) + cache.stat_timeout;
node->stat_valid = time(NULL) + cache.stat_timeout_secs;
if (node->stat_valid > node->valid)
node->valid = node->stat_valid;
cache_clean();
@@ -188,7 +191,7 @@ static void cache_add_dir(const char *path, char **dir)
node = cache_get(path);
g_strfreev(node->dir);
node->dir = dir;
node->dir_valid = time(NULL) + cache.dir_timeout;
node->dir_valid = time(NULL) + cache.dir_timeout_secs;
if (node->dir_valid > node->valid)
node->valid = node->dir_valid;
cache_clean();
@@ -210,7 +213,7 @@ static void cache_add_link(const char *path, const char *link, size_t size)
node = cache_get(path);
g_free(node->link);
node->link = g_strndup(link, my_strnlen(link, size-1));
node->link_valid = time(NULL) + cache.link_timeout;
node->link_valid = time(NULL) + cache.link_timeout_secs;
if (node->link_valid > node->valid)
node->valid = node->link_valid;
cache_clean();
@@ -490,6 +493,7 @@ static void cache_unity_fill(struct fuse_cache_operations *oper,
cache_oper->init = oper->oper.init;
#endif
cache_oper->getattr = oper->oper.getattr;
cache_oper->access = oper->oper.access;
cache_oper->readlink = oper->oper.readlink;
cache_oper->getdir = cache_unity_getdir;
cache_oper->mknod = oper->oper.mknod;
@@ -569,20 +573,28 @@ struct fuse_operations *cache_init(struct fuse_cache_operations *oper)
static const struct fuse_opt cache_opts[] = {
{ "cache=yes", offsetof(struct cache, on), 1 },
{ "cache=no", offsetof(struct cache, on), 0 },
{ "cache_timeout=%u", offsetof(struct cache, stat_timeout), 0 },
{ "cache_timeout=%u", offsetof(struct cache, dir_timeout), 0 },
{ "cache_timeout=%u", offsetof(struct cache, link_timeout), 0 },
{ "cache_stat_timeout=%u", offsetof(struct cache, stat_timeout), 0 },
{ "cache_dir_timeout=%u", offsetof(struct cache, dir_timeout), 0 },
{ "cache_link_timeout=%u", offsetof(struct cache, link_timeout), 0 },
{ "cache_timeout=%u", offsetof(struct cache, stat_timeout_secs), 0 },
{ "cache_timeout=%u", offsetof(struct cache, dir_timeout_secs), 0 },
{ "cache_timeout=%u", offsetof(struct cache, link_timeout_secs), 0 },
{ "cache_stat_timeout=%u", offsetof(struct cache, stat_timeout_secs), 0 },
{ "cache_dir_timeout=%u", offsetof(struct cache, dir_timeout_secs), 0 },
{ "cache_link_timeout=%u", offsetof(struct cache, link_timeout_secs), 0 },
{ "cache_max_size=%u", offsetof(struct cache, max_size), 0 },
{ "cache_clean_interval=%u", offsetof(struct cache,
clean_interval_secs), 0 },
{ "cache_min_clean_interval=%u", offsetof(struct cache,
min_clean_interval_secs), 0 },
FUSE_OPT_END
};
int cache_parse_options(struct fuse_args *args)
{
cache.stat_timeout = DEFAULT_CACHE_TIMEOUT;
cache.dir_timeout = DEFAULT_CACHE_TIMEOUT;
cache.link_timeout = DEFAULT_CACHE_TIMEOUT;
cache.stat_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS;
cache.dir_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS;
cache.link_timeout_secs = DEFAULT_CACHE_TIMEOUT_SECS;
cache.max_size = DEFAULT_MAX_CACHE_SIZE;
cache.clean_interval_secs = DEFAULT_CACHE_CLEAN_INTERVAL_SECS;
cache.min_clean_interval_secs = DEFAULT_MIN_CACHE_CLEAN_INTERVAL_SECS;
cache.on = 1;
return fuse_opt_parse(args, &cache, cache_opts, NULL);
+246
View File
@@ -0,0 +1,246 @@
/*
* Copyright (c) 2006-2008 Amit Singh/Google Inc.
* Copyright (c) 2012 Anatol Pomozov
* Copyright (c) 2011-2013 Benjamin Fleischer
*/
#include "darwin_compat.h"
#include <assert.h>
#include <errno.h>
#include <sys/types.h>
/*
* Semaphore implementation based on:
*
* Copyright (C) 2000,02 Free Software Foundation, Inc.
* This file is part of the GNU C Library.
* Written by Ga<EB>l Le Mignot <address@hidden>
*
* The GNU C Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The GNU C Library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with the GNU C Library; see the file COPYING.LIB. If not,
* write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/* Semaphores */
#define __SEM_ID_NONE ((int)0x0)
#define __SEM_ID_LOCAL ((int)0xcafef00d)
/* http://www.opengroup.org/onlinepubs/007908799/xsh/sem_init.html */
int
darwin_sem_init(darwin_sem_t *sem, int pshared, unsigned int value)
{
if (pshared) {
errno = ENOSYS;
return -1;
}
sem->id = __SEM_ID_NONE;
if (pthread_cond_init(&sem->__data.local.count_cond, NULL)) {
goto cond_init_fail;
}
if (pthread_mutex_init(&sem->__data.local.count_lock, NULL)) {
goto mutex_init_fail;
}
sem->__data.local.count = value;
sem->id = __SEM_ID_LOCAL;
return 0;
mutex_init_fail:
pthread_cond_destroy(&sem->__data.local.count_cond);
cond_init_fail:
return -1;
}
/* http://www.opengroup.org/onlinepubs/007908799/xsh/sem_destroy.html */
int
darwin_sem_destroy(darwin_sem_t *sem)
{
int res = 0;
pthread_mutex_lock(&sem->__data.local.count_lock);
sem->id = __SEM_ID_NONE;
pthread_cond_broadcast(&sem->__data.local.count_cond);
if (pthread_cond_destroy(&sem->__data.local.count_cond)) {
res = -1;
}
pthread_mutex_unlock(&sem->__data.local.count_lock);
if (pthread_mutex_destroy(&sem->__data.local.count_lock)) {
res = -1;
}
return res;
}
int
darwin_sem_getvalue(darwin_sem_t *sem, unsigned int *sval)
{
int res = 0;
pthread_mutex_lock(&sem->__data.local.count_lock);
if (sem->id != __SEM_ID_LOCAL) {
res = -1;
errno = EINVAL;
} else {
*sval = sem->__data.local.count;
}
pthread_mutex_unlock(&sem->__data.local.count_lock);
return res;
}
/* http://www.opengroup.org/onlinepubs/007908799/xsh/sem_post.html */
int
darwin_sem_post(darwin_sem_t *sem)
{
int res = 0;
pthread_mutex_lock(&sem->__data.local.count_lock);
if (sem->id != __SEM_ID_LOCAL) {
res = -1;
errno = EINVAL;
} else if (sem->__data.local.count < DARWIN_SEM_VALUE_MAX) {
sem->__data.local.count++;
if (sem->__data.local.count == 1) {
pthread_cond_signal(&sem->__data.local.count_cond);
}
} else {
errno = ERANGE;
res = -1;
}
pthread_mutex_unlock(&sem->__data.local.count_lock);
return res;
}
/* http://www.opengroup.org/onlinepubs/009695399/functions/sem_timedwait.html */
int
darwin_sem_timedwait(darwin_sem_t *sem, const struct timespec *abs_timeout)
{
int res = 0;
if (abs_timeout &&
(abs_timeout->tv_nsec < 0 || abs_timeout->tv_nsec >= 1000000000)) {
errno = EINVAL;
return -1;
}
pthread_cleanup_push((void(*)(void*))&pthread_mutex_unlock,
&sem->__data.local.count_lock);
pthread_mutex_lock(&sem->__data.local.count_lock);
if (sem->id != __SEM_ID_LOCAL) {
errno = EINVAL;
res = -1;
} else {
if (!sem->__data.local.count) {
res = pthread_cond_timedwait(&sem->__data.local.count_cond,
&sem->__data.local.count_lock,
abs_timeout);
}
if (res) {
assert(res == ETIMEDOUT);
res = -1;
errno = ETIMEDOUT;
} else if (sem->id != __SEM_ID_LOCAL) {
res = -1;
errno = EINVAL;
} else {
sem->__data.local.count--;
}
}
pthread_cleanup_pop(1);
return res;
}
/* http://www.opengroup.org/onlinepubs/007908799/xsh/sem_trywait.html */
int
darwin_sem_trywait(darwin_sem_t *sem)
{
int res = 0;
pthread_mutex_lock(&sem->__data.local.count_lock);
if (sem->id != __SEM_ID_LOCAL) {
res = -1;
errno = EINVAL;
} else if (sem->__data.local.count) {
sem->__data.local.count--;
} else {
res = -1;
errno = EAGAIN;
}
pthread_mutex_unlock (&sem->__data.local.count_lock);
return res;
}
/* http://www.opengroup.org/onlinepubs/007908799/xsh/sem_wait.html */
int
darwin_sem_wait(darwin_sem_t *sem)
{
int res = 0;
pthread_cleanup_push((void(*)(void*))&pthread_mutex_unlock,
&sem->__data.local.count_lock);
pthread_mutex_lock(&sem->__data.local.count_lock);
if (sem->id != __SEM_ID_LOCAL) {
errno = EINVAL;
res = -1;
} else {
if (!sem->__data.local.count) {
pthread_cond_wait(&sem->__data.local.count_cond,
&sem->__data.local.count_lock);
if (!sem->__data.local.count) {
/* spurious wakeup, assume it is an interruption */
res = -1;
errno = EINTR;
goto out;
}
}
if (sem->id != __SEM_ID_LOCAL) {
res = -1;
errno = EINVAL;
} else {
sem->__data.local.count--;
}
}
out:
pthread_cleanup_pop(1);
return res;
}
+49
View File
@@ -0,0 +1,49 @@
/*
* Copyright (c) 2006-2008 Amit Singh/Google Inc.
* Copyright (c) 2011-2013 Benjamin Fleischer
*/
#ifndef _DARWIN_COMPAT_
#define _DARWIN_COMPAT_
#include <pthread.h>
/* Semaphores */
typedef struct darwin_sem {
int id;
union {
struct
{
unsigned int count;
pthread_mutex_t count_lock;
pthread_cond_t count_cond;
} local;
} __data;
} darwin_sem_t;
#define DARWIN_SEM_VALUE_MAX ((int32_t)32767)
int darwin_sem_init(darwin_sem_t *sem, int pshared, unsigned int value);
int darwin_sem_destroy(darwin_sem_t *sem);
int darwin_sem_getvalue(darwin_sem_t *sem, unsigned int *value);
int darwin_sem_post(darwin_sem_t *sem);
int darwin_sem_timedwait(darwin_sem_t *sem, const struct timespec *abs_timeout);
int darwin_sem_trywait(darwin_sem_t *sem);
int darwin_sem_wait(darwin_sem_t *sem);
/* Caller must not include <semaphore.h> */
typedef darwin_sem_t sem_t;
#define sem_init(s, p, v) darwin_sem_init(s, p, v)
#define sem_destroy(s) darwin_sem_destroy(s)
#define sem_getvalue(s, v) darwin_sem_getvalue(s, v)
#define sem_post(s) darwin_sem_post(s)
#define sem_timedwait(s, t) darwin_sem_timedwait(s, t)
#define sem_trywait(s) darwin_sem_trywait(s)
#define sem_wait(s) darwin_sem_wait(s)
#define SEM_VALUE_MAX DARWIN_SEM_VALUE_MAX
#endif /* _DARWIN_COMPAT_ */
+23 -4
View File
@@ -1,5 +1,6 @@
AC_INIT(sshfs-fuse, 2.4)
AM_INIT_AUTOMAKE
AC_INIT(sshfs, 2.7)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE([foreign subdir-objects])
AM_CONFIG_HEADER(config.h)
AC_PROG_CC
@@ -11,6 +12,12 @@ sshnodelay_libs=$LIBS
AC_SUBST(sshnodelay_libs)
LIBS=
case "$target_os" in
*linux*) osname=linux;;
*darwin*) osname=darwin;;
*) osname=unknown;;
esac
AC_ARG_ENABLE(sshnodelay,
[ --disable-sshnodelay Don't compile NODELAY workaround for ssh])
@@ -43,10 +50,22 @@ oldlibs="$LIBS"
LIBS="$LIBS $SSHFS_LIBS"
AC_CHECK_FUNC([fuse_opt_parse], [have_fuse_opt_parse=yes])
LIBS="$oldlibs"
if test "$have_fuse_opt_parse" = no; then
CFLAGS="$CFLAGS -Icompat"
if test "$have_fuse_opt_parse" = no -o "$osname" = darwin; then
CFLAGS="$CFLAGS -I${srcdir}/compat"
fi
AM_CONDITIONAL(FUSE_OPT_COMPAT, test "$have_fuse_opt_parse" = no)
AM_CONDITIONAL(DARWIN_COMPAT, test "$osname" = darwin)
AC_CHECK_PROG(UNMOUNT_COMMAND, fusermount, fusermount -u, umount)
# TODO: Figure out why we special-case this in Darwin. Would be nice if
# the default setting was consistent across platforms so we wouldn't need
# to care about it here.
case "$osname" in
darwin) IDMAP_DEFAULT=user ;;
*) IDMAP_DEFAULT=none ;;
esac
AC_SUBST(IDMAP_DEFAULT)
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
-11
View File
@@ -1,11 +0,0 @@
#! /bin/bash
(
echo "See http://fuse.sourceforge.net/wiki/index.php/SshfsFaq for the latest"
echo "version of this FAQ"
echo "---"
echo
lynx -nolist -dump http://fuse.sourceforge.net/wiki/index.php/SshfsFaq \
| sed -e '1,12d' -e '/____/,$d'
) > FAQ.txt
+16 -7
View File
@@ -7,7 +7,7 @@ SSHFS \- filesystem client based on ssh
\fBsshfs\fP [\fIuser\fP@]\fBhost\fP:[\fIdir\fP] \fBmountpoint\fP [\fIoptions\fP]
.SS unmounting
.TP
\fBfusermount -u mountpoint\fP
\fB__UNMOUNT_COMMAND__ mountpoint\fP
.SH DESCRIPTION
SSHFS (Secure SHell FileSystem) is a file system for Linux (and other
operating systems with a FUSE implementation, such as Mac OS X or FreeBSD)
@@ -58,6 +58,9 @@ synchronous writes
\fB\-o\fR no_readahead
synchronous reads (no speculative readahead)
.TP
\fB\-o\fR sync_readdir
synchronous readdir
.TP
\fB\-o\fR sshfs_debug
print some debugging information
.TP
@@ -94,14 +97,14 @@ fix buffer fillup bug in server (default: on)
.RE
.TP
\fB\-o\fR idmap=TYPE
user/group ID mapping, possible types are:
user/group ID mapping (default: __IDMAP_DEFAULT__)
.RS 8
.TP
none
no translation of the ID space (default)
no translation of the ID space
.TP
user
only translate UID of connecting user
only translate UID/GID of connecting user
.TP
file
translate UIDs/GIDs based upon the contents of \fBuidfile \fR and
@@ -141,6 +144,14 @@ directly connect to PORT bypassing ssh
\fB\-o\fR slave
communicate over stdin and stdout bypassing network
.TP
\fB\-o\fR slave
communicate over stdin and stdout bypassing network
.TP
\fB\-o\fR disable_hardlink
link(2) will return with errno set to ENOSYS. Hard links don't currently work
perfectly on sshfs, and this confuses some programs. If that happens try
disabling hard links with this option.
.TP
\fB\-o\fR transform_symlinks
transform absolute symlinks to relative
.TP
@@ -256,7 +267,7 @@ perform reads synchronously
\fB\-o\fR subdir=DIR
prepend this directory to all paths (mandatory)
.TP
\fB\-o\fR [no]rellinksa
\fB\-o\fR [no]rellinks
transform absolute symlinks to relative
.TP
[iconv]
@@ -273,5 +284,3 @@ SSHFS has been written by Miklos Szeredi <miklos@szeredi.hu>.
.LP
This man page was written by Bartosz Fenski <fenio@debian.org> for the
Debian GNU/Linux distribution (but it may be used by others).
+279 -21
View File
@@ -12,6 +12,9 @@
#include <fuse.h>
#include <fuse_opt.h>
#include <fuse_lowlevel.h>
#ifdef __APPLE__
# include <fuse_darwin.h>
#endif
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@@ -20,7 +23,9 @@
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <semaphore.h>
#ifndef __APPLE__
# include <semaphore.h>
#endif
#include <pthread.h>
#include <netdb.h>
#include <signal.h>
@@ -38,6 +43,11 @@
#include <pwd.h>
#include <grp.h>
#include <limits.h>
#ifdef __APPLE__
# include <strings.h>
# include <libgen.h>
# include <darwin_compat.h>
#endif
#include "cache.h"
@@ -121,6 +131,16 @@
#define SSHNODELAY_SO "sshnodelay.so"
/* Asynchronous readdir parameters */
#define READDIR_START 2
#define READDIR_MAX 32
#define MAX_PASSWORD 1024
#ifdef __APPLE__
static char sshfs_program_path[PATH_MAX] = { 0 };
#endif /* __APPLE__ */
struct buffer {
uint8_t *p;
size_t len;
@@ -139,6 +159,7 @@ struct request {
unsigned int want_reply;
sem_t ready;
uint8_t reply_type;
uint32_t id;
int replied;
int error;
struct buffer reply;
@@ -203,6 +224,7 @@ struct sshfs {
int detect_uid;
int idmap;
int nomap;
int disable_hardlink;
char *uid_file;
char *gid_file;
GHashTable *uid_map;
@@ -214,6 +236,7 @@ struct sshfs {
unsigned ssh_ver;
int sync_write;
int sync_read;
int sync_readdir;
int debug;
int foreground;
int reconnect;
@@ -234,6 +257,10 @@ struct sshfs {
int server_version;
unsigned remote_uid;
unsigned local_uid;
#ifdef __APPLE__
unsigned remote_gid;
unsigned local_gid;
#endif
int remote_uid_detected;
unsigned blksize;
char *progname;
@@ -247,6 +274,7 @@ struct sshfs {
int ext_statvfs;
int ext_hardlink;
mode_t mnt_mode;
struct fuse_operations *op;
/* statistics */
uint64_t bytes_sent;
@@ -350,6 +378,7 @@ static struct fuse_opt sshfs_opts[] = {
SSHFS_OPT("nomap=error", nomap, NOMAP_ERROR),
SSHFS_OPT("sshfs_sync", sync_write, 1),
SSHFS_OPT("no_readahead", sync_read, 1),
SSHFS_OPT("sync_readdir", sync_readdir, 1),
SSHFS_OPT("sshfs_debug", debug, 1),
SSHFS_OPT("reconnect", reconnect, 1),
SSHFS_OPT("transform_symlinks", transform_symlinks, 1),
@@ -358,6 +387,7 @@ static struct fuse_opt sshfs_opts[] = {
SSHFS_OPT("password_stdin", password_stdin, 1),
SSHFS_OPT("delay_connect", delay_connect, 1),
SSHFS_OPT("slave", slave, 1),
SSHFS_OPT("disable_hardlink", disable_hardlink, 1),
FUSE_OPT_KEY("-p ", KEY_PORT),
FUSE_OPT_KEY("-C", KEY_COMPRESS),
@@ -727,8 +757,17 @@ static int buf_get_attrs(struct buffer *buf, struct stat *stbuf, int *flagsp)
}
}
#ifdef __APPLE__
if (sshfs.remote_uid_detected) {
if (uid == sshfs.remote_uid)
uid = sshfs.local_uid;
if (gid == sshfs.remote_gid)
gid = sshfs.local_gid;
}
#else /* !__APPLE__ */
if (sshfs.remote_uid_detected && uid == sshfs.remote_uid)
uid = sshfs.local_uid;
#endif /* __APPLE__ */
if (sshfs.idmap == IDMAP_FILE && sshfs.uid_map)
if (translate_id(&uid, sshfs.uid_map) == -1)
return -EPERM;
@@ -837,11 +876,35 @@ static void ssh_add_arg(const char *arg)
#ifdef SSH_NODELAY_WORKAROUND
static int do_ssh_nodelay_workaround(void)
{
#ifdef __APPLE__
char *oldpreload = getenv("DYLD_INSERT_LIBRARIES");
#else
char *oldpreload = getenv("LD_PRELOAD");
#endif
char *newpreload;
char sopath[PATH_MAX];
int res;
#ifdef __APPLE__
char *sshfs_program_path_base = NULL;
if (!sshfs_program_path[0]) {
goto nobundle;
}
sshfs_program_path_base = dirname(sshfs_program_path);
if (!sshfs_program_path_base) {
goto nobundle;
}
snprintf(sopath, sizeof(sopath), "%s/%s", sshfs_program_path_base,
SSHNODELAY_SO);
res = access(sopath, R_OK);
if (res == -1) {
goto nobundle;
}
goto pathok;
nobundle:
#endif /* __APPLE__ */
snprintf(sopath, sizeof(sopath), "%s/%s", LIBDIR, SSHNODELAY_SO);
res = access(sopath, R_OK);
if (res == -1) {
@@ -867,15 +930,24 @@ static int do_ssh_nodelay_workaround(void)
}
}
#ifdef __APPLE__
pathok:
#endif
newpreload = g_strdup_printf("%s%s%s",
oldpreload ? oldpreload : "",
oldpreload ? " " : "",
sopath);
#ifdef __APPLE__
if (!newpreload || setenv("DYLD_INSERT_LIBRARIES", newpreload, 1) == -1)
fprintf(stderr, "warning: failed set DYLD_INSERT_LIBRARIES for ssh nodelay workaround\n");
#else /* !__APPLE__ */
if (!newpreload || setenv("LD_PRELOAD", newpreload, 1) == -1) {
fprintf(stderr, "warning: failed set LD_PRELOAD "
"for ssh nodelay workaround\n");
}
#endif /* __APPLE__ */
g_free(newpreload);
return 0;
}
@@ -1595,6 +1667,10 @@ static void sftp_detect_uid()
sshfs.remote_uid = stbuf.st_uid;
sshfs.local_uid = getuid();
#ifdef __APPLE__
sshfs.remote_gid = stbuf.st_gid;
sshfs.local_gid = getgid();
#endif
sshfs.remote_uid_detected = 1;
DEBUG("remote_uid = %i\n", sshfs.remote_uid);
@@ -1620,7 +1696,7 @@ static int sftp_check_root(const char *base_path)
buf_init(&buf, 0);
buf_add_string(&buf, remote_dir);
buf_to_iov(&buf, &iov[0]);
if (sftp_send_iov(SSH_FXP_STAT, id, iov, 1) == -1)
if (sftp_send_iov(SSH_FXP_LSTAT, id, iov, 1) == -1)
goto out;
buf_clear(&buf);
if (sftp_read(&type, &buf) == -1)
@@ -1790,6 +1866,13 @@ static int sftp_request_wait(struct request *req, uint8_t type,
err = -EIO;
break;
case SSH_FX_FAILURE:
if (type == SSH_FXP_RMDIR)
err = -ENOTEMPTY;
else
err = -EPERM;
break;
default:
err = -sftp_error_to_errno(serr);
}
@@ -1827,6 +1910,7 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
if (begin_func)
begin_func(req);
id = sftp_get_id();
req->id = id;
err = start_processing_thread();
if (err) {
pthread_mutex_unlock(&sshfs.lock);
@@ -1915,6 +1999,22 @@ static int sshfs_getattr(const char *path, struct stat *stbuf)
return err;
}
static int sshfs_access(const char *path, int mask)
{
struct stat stbuf;
int err = 0;
if (mask & X_OK) {
err = sshfs.op->getattr(path, &stbuf);
if (!err) {
if (S_ISREG(stbuf.st_mode) &&
!(stbuf.st_mode & (S_IXUSR|S_IXGRP|S_IXOTH)))
err = -EACCES;
}
}
return err;
}
static int count_components(const char *p)
{
int ctr;
@@ -2014,6 +2114,113 @@ static int sshfs_readlink(const char *path, char *linkbuf, size_t size)
return err;
}
static int sftp_readdir_send(struct request **req, struct buffer *handle)
{
struct iovec iov;
buf_to_iov(handle, &iov);
return sftp_request_send(SSH_FXP_READDIR, &iov, 1, NULL, NULL,
SSH_FXP_NAME, NULL, req);
}
static int sshfs_req_pending(struct request *req)
{
if (g_hash_table_lookup(sshfs.reqtab, GUINT_TO_POINTER(req->id)))
return 1;
else
return 0;
}
static int sftp_readdir_async(struct buffer *handle, fuse_cache_dirh_t h,
fuse_cache_dirfil_t filler)
{
int err = 0;
int outstanding = 0;
int max = READDIR_START;
GList *list = NULL;
int done = 0;
while (!done || outstanding) {
struct request *req;
struct buffer name;
int tmperr;
while (!done && outstanding < max) {
tmperr = sftp_readdir_send(&req, handle);
if (tmperr && !done) {
err = tmperr;
done = 1;
break;
}
list = g_list_append(list, req);
outstanding++;
}
if (outstanding) {
GList *first;
/* wait for response to next request */
first = g_list_first(list);
req = first->data;
list = g_list_delete_link(list, first);
outstanding--;
if (done) {
pthread_mutex_lock(&sshfs.lock);
if (sshfs_req_pending(req))
req->want_reply = 0;
pthread_mutex_unlock(&sshfs.lock);
if (!req->want_reply)
continue;
}
tmperr = sftp_request_wait(req, SSH_FXP_READDIR,
SSH_FXP_NAME, &name);
if (tmperr && !done) {
err = tmperr;
if (err == MY_EOF)
err = 0;
done = 1;
}
if (!done) {
err = buf_get_entries(&name, h, filler);
buf_free(&name);
/* increase number of outstanding requests */
if (max < READDIR_MAX)
max++;
if (err)
done = 1;
}
}
}
assert(list == NULL);
return err;
}
static int sftp_readdir_sync(struct buffer *handle, fuse_cache_dirh_t h,
fuse_cache_dirfil_t filler)
{
int err;
do {
struct buffer name;
err = sftp_request(SSH_FXP_READDIR, handle, SSH_FXP_NAME, &name);
if (!err) {
err = buf_get_entries(&name, h, filler);
buf_free(&name);
}
} while (!err);
if (err == MY_EOF)
err = 0;
return err;
}
static int sshfs_getdir(const char *path, fuse_cache_dirh_t h,
fuse_cache_dirfil_t filler)
{
@@ -2026,16 +2233,11 @@ static int sshfs_getdir(const char *path, fuse_cache_dirh_t h,
if (!err) {
int err2;
buf_finish(&handle);
do {
struct buffer name;
err = sftp_request(SSH_FXP_READDIR, &handle, SSH_FXP_NAME, &name);
if (!err) {
err = buf_get_entries(&name, h, filler);
buf_free(&name);
}
} while (!err);
if (err == MY_EOF)
err = 0;
if (sshfs.sync_readdir)
err = sftp_readdir_sync(&handle, h, filler);
else
err = sftp_readdir_async(&handle, h, filler);
err2 = sftp_request(SSH_FXP_CLOSE, &handle, 0, NULL);
if (!err)
@@ -2192,7 +2394,7 @@ static int sshfs_link(const char *from, const char *to)
{
int err = -ENOSYS;
if (sshfs.ext_hardlink) {
if (sshfs.ext_hardlink && !sshfs.disable_hardlink) {
struct buffer buf;
buf_init(&buf, 0);
@@ -2226,8 +2428,17 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid)
int err;
struct buffer buf;
#ifdef __APPLE__
if (sshfs.remote_uid_detected) {
if (uid == sshfs.local_uid)
uid = sshfs.remote_uid;
if (gid == sshfs.local_gid)
gid = sshfs.remote_gid;
}
#else /* !__APPLE__ */
if (sshfs.remote_uid_detected && uid == sshfs.local_uid)
uid = sshfs.remote_uid;
#endif /* __APPLE__ */
if (sshfs.idmap == IDMAP_FILE && sshfs.r_uid_map)
if(translate_id(&uid, sshfs.r_uid_map) == -1)
return -EPERM;
@@ -3115,6 +3326,7 @@ static struct fuse_cache_operations sshfs_oper = {
.oper = {
.init = sshfs_init,
.getattr = sshfs_getattr,
.access = sshfs_access,
.readlink = sshfs_readlink,
.mknod = sshfs_mknod,
.mkdir = sshfs_mkdir,
@@ -3162,10 +3374,18 @@ static void usage(const char *progname)
" -o delay_connect delay connection to server\n"
" -o sshfs_sync synchronous writes\n"
" -o no_readahead synchronous reads (no speculative readahead)\n"
" -o sync_readdir synchronous readdir\n"
" -o sshfs_debug print some debugging information\n"
" -o cache=BOOL enable caching {yes,no} (default: yes)\n"
" -o cache_max_size=N sets the maximum size of the cache (default: 10000)\n"
" -o cache_timeout=N sets timeout for caches in seconds (default: 20)\n"
" -o cache_X_timeout=N sets timeout for {stat,dir,link} cache\n"
" -o cache_clean_interval=N\n"
" sets the interval for automatic cleaning of the\n"
" cache (default: 60)\n"
" -o cache_min_clean_interval=N\n"
" sets the interval for forced cleaning of the\n"
" cache if full (default: 5)\n"
" -o workaround=LIST colon separated list of workarounds\n"
" none no workarounds enabled\n"
" all all workarounds enabled\n"
@@ -3176,9 +3396,9 @@ static void usage(const char *progname)
" [no]nodelaysrv set nodelay tcp flag in sshd (default: off)\n"
" [no]truncate fix truncate for old servers (default: off)\n"
" [no]buflimit fix buffer fillup bug in server (default: on)\n"
" -o idmap=TYPE user/group ID mapping, possible types are:\n"
" none no translation of the ID space (default)\n"
" user only translate UID of connecting user\n"
" -o idmap=TYPE user/group ID mapping (default: " IDMAP_DEFAULT ")\n"
" none no translation of the ID space\n"
" user only translate UID/GID of connecting user\n"
" file translate UIDs/GIDs contained in uidfile/gidfile\n"
" -o uidfile=FILE file containing username:remote_uid mappings\n"
" -o gidfile=FILE file containing groupname:remote_gid mappings\n"
@@ -3190,6 +3410,7 @@ static void usage(const char *progname)
" -o sftp_server=SERV path to sftp server or subsystem (default: sftp)\n"
" -o directport=PORT directly connect to PORT bypassing ssh\n"
" -o slave communicate over stdin and stdout bypassing network\n"
" -o disable_hardlink link(2) will return with errno set to ENOSYS\n"
" -o transform_symlinks transform absolute symlinks to relative\n"
" -o follow_symlinks follow symlinks on the server\n"
" -o no_check_root don't check for existence of 'dir' on server\n"
@@ -3215,10 +3436,11 @@ static int is_ssh_opt(const char *arg)
static int sshfs_fuse_main(struct fuse_args *args)
{
sshfs.op = cache_init(&sshfs_oper);
#if FUSE_VERSION >= 26
return fuse_main(args->argc, args->argv, cache_init(&sshfs_oper), NULL);
return fuse_main(args->argc, args->argv, sshfs.op, NULL);
#else
return fuse_main(args->argc, args->argv, cache_init(&sshfs_oper));
return fuse_main(args->argc, args->argv, sshfs.op);
#endif
}
@@ -3342,7 +3564,7 @@ static void check_large_read(struct fuse_args *args)
static int read_password(void)
{
int size = getpagesize();
int max_password = 64;
int max_password = MIN(MAX_PASSWORD, size - 1);
int n;
sshfs.password = mmap(NULL, size, PROT_READ | PROT_WRITE,
@@ -3352,6 +3574,13 @@ static int read_password(void)
perror("Failed to allocate locked page for password");
return -1;
}
if (mlock(sshfs.password, size) != 0) {
memset(sshfs.password, 0, size);
munmap(sshfs.password, size);
sshfs.password = NULL;
perror("Failed to allocate locked page for password");
return -1;
}
/* Don't use fgets() because password might stay in memory */
for (n = 0; n < max_password; n++) {
@@ -3677,7 +3906,11 @@ static inline void load_gid_map(void)
read_id_map(sshfs.gid_file, &groupname_to_gid, "gid", &sshfs.gid_map, &sshfs.r_gid_map);
}
#ifdef __APPLE__
int main(int argc, char *argv[], __unused char *envp[], char **exec_path)
#else
int main(int argc, char *argv[])
#endif
{
int res;
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
@@ -3686,6 +3919,14 @@ int main(int argc, char *argv[])
const char *sftp_server;
int libver;
#ifdef __APPLE__
if (!realpath(*exec_path, sshfs_program_path)) {
memset(sshfs_program_path, 0, PATH_MAX);
}
/* Until this gets fixed somewhere else. */
g_slice_set_config(G_SLICE_CONFIG_ALWAYS_MALLOC, TRUE);
#endif /* __APPLE__ */
g_thread_init(NULL);
sshfs.blksize = 4096;
@@ -3694,7 +3935,11 @@ int main(int argc, char *argv[])
sshfs.max_write = 32768;
sshfs.nodelay_workaround = 1;
sshfs.nodelaysrv_workaround = 0;
#ifdef __APPLE__
sshfs.rename_workaround = 1;
#else
sshfs.rename_workaround = 0;
#endif
sshfs.truncate_workaround = 0;
sshfs.buflimit_workaround = 1;
sshfs.ssh_ver = 2;
@@ -3706,7 +3951,15 @@ int main(int argc, char *argv[])
sshfs.delay_connect = 0;
sshfs.slave = 0;
sshfs.detect_uid = 0;
sshfs.idmap = IDMAP_NONE;
if (strcmp(IDMAP_DEFAULT, "none") == 0) {
sshfs.idmap = IDMAP_NONE;
} else if (strcmp(IDMAP_DEFAULT, "user") == 0) {
sshfs.idmap = IDMAP_USER;
} else {
fprintf(stderr, "bad idmap default value built into sshfs; "
"assuming none (bad logic in configure script?)\n");
sshfs.idmap = IDMAP_NONE;
}
sshfs.nomap = NOMAP_ERROR;
ssh_add_arg("ssh");
ssh_add_arg("-x");
@@ -3856,13 +4109,18 @@ int main(int argc, char *argv[])
if (res == -1)
perror("WARNING: failed to set FD_CLOEXEC on fuse device");
fuse = fuse_new(ch, &args, cache_init(&sshfs_oper),
sshfs.op = cache_init(&sshfs_oper);
fuse = fuse_new(ch, &args, sshfs.op,
sizeof(struct fuse_operations), NULL);
if (fuse == NULL) {
fuse_unmount(mountpoint, ch);
exit(1);
}
/*
* FIXME: trim $PATH so it doesn't contain anything inside the
* mountpoint, which would deadlock.
*/
res = ssh_connect();
if (res == -1) {
fuse_unmount(mountpoint, ch);
+45 -4
View File
@@ -5,14 +5,55 @@
#include <netinet/in.h>
#include <netinet/tcp.h>
int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
/* Wrapper around connect(2) to explicitly set TCP_NODELAY. */
static int nodelay_connect(
int (*real_connect)(int, const struct sockaddr *, socklen_t),
int sock, const struct sockaddr *addr, socklen_t addrlen)
{
int (*next_connect)(int, const struct sockaddr *, socklen_t) =
dlsym(RTLD_NEXT, "connect");
int res = next_connect(sock, addr, addrlen);
int res = real_connect(sock, addr, addrlen);
if (!res && addr->sa_family == AF_INET) {
int opt = 1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt));
}
return res;
}
#if __APPLE__
/* OS X does not have LD_PRELOAD but has DYLD_INSERT_LIBRARIES. The right
* environment variable is set by sshfs.c when attempting to load the
* sshnodelay workaround.
*
* However, things are not that simple: DYLD_INSERT_LIBRARIES does not
* behave exactly like LD_PRELOAD. Instead, the dyld dynamic linker will
* look for __DATA __interpose sections on the libraries given via the
* DYLD_INSERT_LIBRARIES variable. The contents of this section are pairs
* of replacement functions and functions to be replaced, respectively.
* Prepare such section here. */
int custom_connect(int sock, const struct sockaddr *addr, socklen_t addrlen);
typedef struct interpose_s {
void *new_func;
void *orig_func;
} interpose_t;
static const interpose_t interposers[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)custom_connect, (void *)connect },
};
int custom_connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
{
return nodelay_connect(connect, sock, addr, addrlen);
}
#else /* !__APPLE__ */
int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
{
return nodelay_connect(dlsym(RTLD_NEXT, "connect"),
sock, addr, addrlen);
}
#endif /* !__APPLE__ */