Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c91eb9a9a9 | |||
| 103c6ba68b | |||
| a2054a2b73 | |||
| fd02499b4c | |||
| c2715f7453 | |||
| 1abde6e779 | |||
| a181b9b60b | |||
| d54c7ecbd6 | |||
| 803e0e65cf |
@@ -0,0 +1 @@
|
||||
d54c7ecbd618afb4df524e0d96dec7fe7cc2935d
|
||||
@@ -11,7 +11,7 @@ PLEASE READ BEFORE REPORTING AN ISSUE
|
||||
|
||||
SSHFS does not have any active, regular contributors or developers. The current maintainer continues to apply pull requests and tries to make regular releases, but unfortunately has no capacity to do any development beyond addressing high-impact issues. When reporting bugs, please understand that unless you are including a pull request or are reporting a critical issue, you will probably not get a response.
|
||||
|
||||
To prevent the issue tracker from being flooded with issues that no-one is intending to work on, and to give more visibilty to critical issues that users should be aware of and that most urgently need attention, I will also close most bug reports once they've been inactive for a while.
|
||||
To prevent the issue tracker from being flooded with issues that no-one is intending to work on, and to give more visibility to critical issues that users should be aware of and that most urgently need attention, I will also close most bug reports once they've been inactive for a while.
|
||||
|
||||
Please note that this isn't meant to imply that you haven't found a bug - you most likely have and I'm grateful that you took the time to report it. Unfortunately, SSHFS is a purely volunteer driven project,
|
||||
and at the moment there simply aren't any volunteers.
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
# See https://pre-commit.com for more information
|
||||
# See https://pre-commit.com/hooks.html for more hooks
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.0.1
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
- id: check-yaml
|
||||
- id: check-added-large-files
|
||||
- repo: https://github.com/jumanjihouse/pre-commit-hooks
|
||||
rev: 2.1.5
|
||||
hooks:
|
||||
- id: shellcheck
|
||||
+15
-5
@@ -1,11 +1,14 @@
|
||||
dist: focal
|
||||
sudo: enabled
|
||||
|
||||
language:
|
||||
- c
|
||||
language: c
|
||||
|
||||
cache:
|
||||
- pip
|
||||
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- shellcheck
|
||||
- valgrind
|
||||
- gcc
|
||||
- clang
|
||||
@@ -16,6 +19,13 @@ addons:
|
||||
- meson
|
||||
- python3-pytest
|
||||
- libglib2.0-dev
|
||||
install: test/travis-install.sh
|
||||
script: test/travis-build.sh
|
||||
|
||||
install: test/travis-install.sh
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- name: Lint
|
||||
script: ./test/lint.sh
|
||||
install: skip
|
||||
- name: Build + Test
|
||||
script: test/travis-build.sh
|
||||
|
||||
@@ -1,28 +1,31 @@
|
||||
Current Maintainer
|
||||
------------------
|
||||
|
||||
Nikolaus Rath <Nikolaus@rath.org>
|
||||
None.
|
||||
|
||||
|
||||
Past Maintainers
|
||||
----------------
|
||||
|
||||
Nikolaus Rath <Nikolaus@rath.org> (until 05/2022)
|
||||
Miklos Szeredi <miklos@szeredi.hu> (until 12/2015)
|
||||
|
||||
|
||||
Contributors (autogenerated list)
|
||||
---------------------------------
|
||||
|
||||
|
||||
a1346054 <36859588+a1346054@users.noreply.github.com>
|
||||
Alan Jenkins <alan.christopher.jenkins@gmail.com>
|
||||
Alexander Neumann <alexander@bumpern.de>
|
||||
Anatol Pomozov <anatol.pomozov@gmail.com>
|
||||
Andrew Stone <a@stne.dev>
|
||||
Antonio Rojas <arojas@archlinux.org>
|
||||
Benjamin Fleischer <fleiben@gmail.com>
|
||||
Berserker <berserker.troll@yandex.com>
|
||||
Bill Zissimopoulos <billziss@navimatics.com>
|
||||
bjoe2k4 <bjoe2k4@users.noreply.github.com>
|
||||
Brandon Carter <b-carter@users.noreply.github.com>
|
||||
Cam Cope <github@camcope.me>
|
||||
Chris Wolfe <cwolfe@chromium.org>
|
||||
Clayton G. Hobbs <clay@lakeserv.net>
|
||||
Daniel Lublin <daniel@lublin.se>
|
||||
@@ -42,6 +45,8 @@ Julio Merino <jmmv@meroh.net>
|
||||
Junichi Uekawa <dancerj@gmail.com>
|
||||
Junichi Uekawa <dancer@netfort.gr.jp>
|
||||
kalvdans <github@kalvdans.no-ip.org>
|
||||
Kim Brose <kim.brose@rwth-aachen.de>
|
||||
Matthew Berginski <matthew.berginski@gmail.com>
|
||||
Michael Forney <mforney@mforney.org>
|
||||
Mike Kelly <mike@pair.com>
|
||||
Mike Salvatore <mike.s.salvatore@gmail.com>
|
||||
@@ -51,6 +56,7 @@ mssalvatore <mike.s.salvatore@gmail.com>
|
||||
Nikolaus Rath <Nikolaus@rath.org>
|
||||
Percy Jahn <email@percyjahn.de>
|
||||
Peter Belm <peterbelm@gmail.com>
|
||||
Peter Wienemann <peter.wienemann@uni-bonn.de>
|
||||
Qais Patankar <qaisjp@gmail.com>
|
||||
Quentin Rameau <quinq@fifth.space>
|
||||
Reid Wagner <wagnerreid@gmail.com>
|
||||
|
||||
+22
-7
@@ -1,3 +1,18 @@
|
||||
Release 3.7.3 (2022-05-26)
|
||||
--------------------------
|
||||
|
||||
* Minor bugfixes.
|
||||
|
||||
* This is the last release from the current maintainer. SSHFS is now no longer maintained
|
||||
or developed. Github issue tracking and pull requests have therefore been disabled. The
|
||||
mailing list (see below) is still available for use.
|
||||
|
||||
If you would like to take over this project, you are welcome to do so. Please fork it
|
||||
and develop the fork for a while. Once there has been 6 months of reasonable activity,
|
||||
please contact Nikolaus@rath.org and I'll be happy to give you ownership of this
|
||||
repository or replace with a pointer to the fork.
|
||||
|
||||
|
||||
Release 3.7.2 (2021-06-08)
|
||||
--------------------------
|
||||
|
||||
@@ -25,7 +40,7 @@ Release 3.7.0 (2020-01-03)
|
||||
needed anymore. If you depend on this workaround, please let the SSHFS maintainers know,
|
||||
otherwise support for the workaround will be removed completely in a future version.
|
||||
|
||||
|
||||
|
||||
Release 3.6.0 (2019-11-03)
|
||||
--------------------------
|
||||
|
||||
@@ -108,13 +123,13 @@ Release 3.1.0 (2017-08-04)
|
||||
|
||||
* For improved backwards compatibility, SSHFS now also silently
|
||||
accepts the old ``-o cache_*`` options.
|
||||
|
||||
|
||||
Release 3.0.0 (2017-07-08)
|
||||
--------------------------
|
||||
|
||||
* sshfs now requires libfuse 3.1.0 or newer.
|
||||
* When supported by the kernel, sshfs now uses writeback caching.
|
||||
* The `cache` option has been renamed to `dir_cache` for clarity.
|
||||
* The `cache` option has been renamed to `dir_cache` for clarity.
|
||||
* Added unit tests
|
||||
* --debug now behaves like -o debug_sshfs, i.e. it enables sshfs
|
||||
debugging messages rather than libfuse debugging messages.
|
||||
@@ -129,7 +144,7 @@ Release 3.0.0 (2017-07-08)
|
||||
* Removed support for `-o workaround=all`. Workarounds should always
|
||||
enabled explicitly and only when needed. There is no point in always
|
||||
enabling a potentially changing set of workarounds.
|
||||
|
||||
|
||||
Release 2.9 (2017-04-17)
|
||||
------------------------
|
||||
|
||||
@@ -168,14 +183,14 @@ Release 2.4 (2012-03-08)
|
||||
------------------------
|
||||
|
||||
* New `slave` option.
|
||||
* New `idmap`, `uidmap` and `gidmap` options.
|
||||
* New `idmap`, `uidmap` and `gidmap` options.
|
||||
* Various small bugfixes.
|
||||
|
||||
Release 2.3 (2011-07-01)
|
||||
------------------------
|
||||
|
||||
* Support hard link creation if server is OpenSSH 5.7 or later
|
||||
* Small improvements and bug fixes
|
||||
* Small improvements and bug fixes
|
||||
* Check mount point and options before connecting to ssh server
|
||||
* New 'delay_connect' option
|
||||
|
||||
@@ -188,7 +203,7 @@ Release 2.2 (2008-10-20)
|
||||
Release 2.1 (2008-07-11)
|
||||
------------------------
|
||||
|
||||
* Small improvements and bug fixes
|
||||
* Small improvements and bug fixes
|
||||
|
||||
Release 2.0 (2008-04-23)
|
||||
------------------------
|
||||
|
||||
+18
-8
@@ -1,3 +1,15 @@
|
||||
This Project is Orphaned
|
||||
========================
|
||||
|
||||
This project is no longer maintained or developed. Github issue tracking and pull requests have
|
||||
therefore been disabled. The mailing list (see below) is still available for use.
|
||||
|
||||
If you would like to take over this project, you are welcome to do so. Please fork it and
|
||||
develop the fork for a while. Once there has been 6 months of reasonable activity, please
|
||||
contact Nikolaus@rath.org and I'll be happy to give you ownership of this repository or
|
||||
replace with a pointer to the fork.
|
||||
|
||||
|
||||
SSHFS
|
||||
=====
|
||||
|
||||
@@ -36,7 +48,7 @@ this to work the mountpoint must be owned by the user. If username is
|
||||
omitted SSHFS will use the local username. If the directory is
|
||||
omitted, SSHFS will mount the (remote) home directory. If you need to
|
||||
enter a password sshfs will ask for it (actually it just runs ssh
|
||||
which ask for the password if needed).
|
||||
which asks for the password if needed).
|
||||
|
||||
Also many ssh options can be specified (see the manual pages for
|
||||
*sftp(1)* and *ssh_config(5)*), including the remote port number
|
||||
@@ -55,11 +67,10 @@ Installation
|
||||
------------
|
||||
|
||||
First, download the latest SSHFS release from
|
||||
https://github.com/libfuse/sshfs/releases. On Linux and BSD, you will
|
||||
also need to install libfuse_ 3.1.0 or newer. On macOS, you need
|
||||
OSXFUSE_ instead. Finally, you need the Glib_ library with development
|
||||
headers (which should be available from your operating system's
|
||||
package manager).
|
||||
https://github.com/libfuse/sshfs/releases. You also need libfuse_ 3.1.0 or newer (or a
|
||||
similar library that provides a libfuse3 compatible interface for your operating
|
||||
system). Finally, you need the Glib_ library with development headers (which should be
|
||||
available from your operating system's package manager).
|
||||
|
||||
To build and install, we recommend to use Meson_ (version 0.38 or
|
||||
newer) and Ninja_. After extracting the sshfs tarball, create a
|
||||
@@ -72,7 +83,7 @@ Normally, the default build options will work fine. If you
|
||||
nevertheless want to adjust them, you can do so with the *mesonconf*
|
||||
command::
|
||||
|
||||
$ mesonconf # list options
|
||||
$ mesonconf # list options
|
||||
$ mesonconf -D strip=true # set an option
|
||||
|
||||
To build, test and install SSHFS, you then use Ninja (running the
|
||||
@@ -83,7 +94,6 @@ tests requires the `py.test`_ Python module)::
|
||||
$ sudo ninja install
|
||||
|
||||
.. _libfuse: http://github.com/libfuse/libfuse
|
||||
.. _OSXFUSE: https://osxfuse.github.io/
|
||||
.. _Glib: https://developer.gnome.org/glib/stable/
|
||||
.. _Meson: http://mesonbuild.com/
|
||||
.. _Ninja: https://ninja-build.org/
|
||||
|
||||
@@ -256,7 +256,7 @@ static void *cache_init(struct fuse_conn_info *conn,
|
||||
{
|
||||
void *res;
|
||||
res = cache.next_oper->init(conn, cfg);
|
||||
|
||||
|
||||
// Cache requires a path for each request
|
||||
cfg->nullpath_ok = 0;
|
||||
|
||||
@@ -318,9 +318,9 @@ static int cache_releasedir(const char *path, struct fuse_file_info *fi)
|
||||
{
|
||||
int err;
|
||||
struct file_handle *cfi;
|
||||
|
||||
|
||||
cfi = (struct file_handle*) fi->fh;
|
||||
|
||||
|
||||
if(cfi->is_open) {
|
||||
fi->fh = cfi->fs_fh;
|
||||
err = cache.next_oper->releasedir(path, fi);
|
||||
@@ -365,7 +365,7 @@ static int cache_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
||||
struct node *node;
|
||||
|
||||
assert(offset == 0);
|
||||
|
||||
|
||||
pthread_mutex_lock(&cache.lock);
|
||||
node = cache_lookup(path);
|
||||
if (node != NULL && node->dir != NULL) {
|
||||
@@ -391,8 +391,8 @@ static int cache_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
|
||||
}
|
||||
cfi->is_open = 1;
|
||||
cfi->fs_fh = fi->fh;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ch.path = path;
|
||||
ch.buf = buf;
|
||||
ch.filler = filler;
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ extern "C" {
|
||||
/**
|
||||
* Option description
|
||||
*
|
||||
* This structure describes a single option, and and action associated
|
||||
* This structure describes a single option, and an action associated
|
||||
* with it, in case it matches.
|
||||
*
|
||||
* More than one such match may occur, in which case the action for
|
||||
|
||||
@@ -27,4 +27,3 @@ gpg --armor --detach-sign "${TAG}.tar.xz"
|
||||
PREV_TAG="$(git tag --list 'sshfs-3*' --sort=-taggerdate --merged "${TAG}^"| head -1)"
|
||||
echo "Contributors from ${PREV_TAG} to ${TAG}:"
|
||||
git log --pretty="format:%an <%aE>" "${PREV_TAG}..${TAG}" | sort -u
|
||||
|
||||
|
||||
+2
-3
@@ -1,4 +1,4 @@
|
||||
project('sshfs', 'c', version: '3.7.2',
|
||||
project('sshfs', 'c', version: '3.7.3',
|
||||
meson_version: '>= 0.40',
|
||||
default_options: [ 'buildtype=debugoptimized' ])
|
||||
|
||||
@@ -26,7 +26,7 @@ endif
|
||||
|
||||
|
||||
rst2man = find_program('rst2man', 'rst2man.py', required: false)
|
||||
|
||||
|
||||
cfg = configuration_data()
|
||||
|
||||
cfg.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
@@ -69,4 +69,3 @@ meson.add_install_script('utils/install_helper.sh',
|
||||
|
||||
|
||||
subdir('test')
|
||||
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
/*
|
||||
Handling of multiple SFTP connections
|
||||
--------------------------------------
|
||||
|
||||
|
||||
An SFTP server is free to return responses to outstanding requests in arbitrary
|
||||
order. However, execution of requests may only be re-ordered and parallelized as long
|
||||
as "the results in the responses will be the same as if [the client] had sent the
|
||||
@@ -158,11 +158,11 @@
|
||||
involved) wait for the other requests to complete. This means that e.g. a readdir
|
||||
request would have to block on most other activity in the same directory, eliminating a
|
||||
major advantage of using multiple connections.
|
||||
|
||||
|
||||
In practice, we can luckily take advantage of the knowledge that most FUSE requests are
|
||||
the result of (synchronous) syscalls from userspace that will block until the
|
||||
corresponding FUSE response has been sent.
|
||||
|
||||
|
||||
If -o sshfs_sync is used, SSHFS always waits for the SFTP server response before
|
||||
returning a FUSE response to userspace. If userspace makes concurrent system calls,
|
||||
there is no ordering guarantee in the first place, so we do not have to worry about
|
||||
@@ -432,7 +432,7 @@ static const char *ssh_opts[] = {
|
||||
"ProxyCommand",
|
||||
"ProxyJump",
|
||||
"ProxyUseFdpass",
|
||||
"PubkeyAcceptedKeyTypes"
|
||||
"PubkeyAcceptedKeyTypes",
|
||||
"PubkeyAuthentication",
|
||||
"RekeyLimit",
|
||||
"RevokedHostKeys",
|
||||
@@ -523,7 +523,7 @@ static struct fuse_opt sshfs_opts[] = {
|
||||
/* For backwards compatibility */
|
||||
SSHFS_OPT("cache=yes", dir_cache, 1),
|
||||
SSHFS_OPT("cache=no", dir_cache, 0),
|
||||
|
||||
|
||||
FUSE_OPT_KEY("writeback_cache=no", FUSE_OPT_KEY_DISCARD),
|
||||
FUSE_OPT_KEY("unreliable_append", FUSE_OPT_KEY_DISCARD),
|
||||
|
||||
@@ -1073,7 +1073,7 @@ static struct conn* get_conn(const struct sshfs_file *sf,
|
||||
|
||||
if (sshfs.max_conns == 1)
|
||||
return &sshfs.conns[0];
|
||||
|
||||
|
||||
if (sf != NULL)
|
||||
return sf->conn;
|
||||
|
||||
@@ -1906,7 +1906,7 @@ static void *sshfs_init(struct fuse_conn_info *conn,
|
||||
|
||||
// SFTP only supports 1-second time resolution
|
||||
conn->time_gran = 1000000000;
|
||||
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -2371,13 +2371,13 @@ static int sshfs_mkdir(const char *path, mode_t mode)
|
||||
// Commutes with pending write(), so we can use any connection
|
||||
err = sftp_request(get_conn(NULL, NULL), SSH_FXP_MKDIR, &buf, SSH_FXP_STATUS, NULL);
|
||||
buf_free(&buf);
|
||||
|
||||
|
||||
if (err == -EPERM) {
|
||||
if (sshfs.op->access(path, R_OK) == 0) {
|
||||
return -EEXIST;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2394,7 +2394,7 @@ static int sshfs_mknod(const char *path, mode_t mode, dev_t rdev)
|
||||
|
||||
// Commutes with pending write(), so we can use any connection
|
||||
conn = get_conn(NULL, NULL);
|
||||
|
||||
|
||||
buf_init(&buf, 0);
|
||||
buf_add_path(&buf, path);
|
||||
buf_add_uint32(&buf, SSH_FXF_WRITE | SSH_FXF_CREAT | SSH_FXF_EXCL);
|
||||
@@ -2532,7 +2532,7 @@ static int sshfs_rename(const char *from, const char *to, unsigned int flags)
|
||||
}
|
||||
pthread_mutex_unlock(&sshfs.lock);
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -2589,12 +2589,12 @@ static int sshfs_chmod(const char *path, mode_t mode,
|
||||
buf_init(&buf, 0);
|
||||
if (sf == NULL)
|
||||
buf_add_path(&buf, path);
|
||||
else
|
||||
else
|
||||
buf_add_buf(&buf, &sf->handle);
|
||||
|
||||
|
||||
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_PERMISSIONS);
|
||||
buf_add_uint32(&buf, mode);
|
||||
|
||||
|
||||
/* FIXME: really needs LSETSTAT extension (debian Bug#640038) */
|
||||
// Commutes with pending write(), so we can use any connection
|
||||
// if the file is not open.
|
||||
@@ -2618,7 +2618,7 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
|
||||
if (!sshfs_file_is_conn(sf))
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
||||
if (sshfs.remote_uid_detected) {
|
||||
if (uid == sshfs.local_uid)
|
||||
uid = sshfs.remote_uid;
|
||||
@@ -2635,7 +2635,7 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
|
||||
buf_init(&buf, 0);
|
||||
if (sf == NULL)
|
||||
buf_add_path(&buf, path);
|
||||
else
|
||||
else
|
||||
buf_add_buf(&buf, &sf->handle);
|
||||
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_UIDGID);
|
||||
buf_add_uint32(&buf, uid);
|
||||
@@ -2685,7 +2685,7 @@ static int sshfs_utimens(const char *path, const struct timespec tv[2],
|
||||
buf_init(&buf, 0);
|
||||
if (sf == NULL)
|
||||
buf_add_path(&buf, path);
|
||||
else
|
||||
else
|
||||
buf_add_buf(&buf, &sf->handle);
|
||||
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_ACMODTIME);
|
||||
buf_add_uint32(&buf, asec);
|
||||
@@ -2740,7 +2740,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
|
||||
|
||||
if (fi->flags & O_APPEND)
|
||||
pflags |= SSH_FXF_APPEND;
|
||||
|
||||
|
||||
sf = g_new0(struct sshfs_file, 1);
|
||||
list_init(&sf->write_reqs);
|
||||
pthread_cond_init(&sf->write_finished, NULL);
|
||||
@@ -2750,7 +2750,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
|
||||
pthread_mutex_lock(&sshfs.lock);
|
||||
sf->modifver= sshfs.modifver;
|
||||
if (sshfs.max_conns > 1) {
|
||||
ce = g_hash_table_lookup(sshfs.conntab, path);
|
||||
ce = g_hash_table_lookup(sshfs.conntab, path);
|
||||
if (!ce) {
|
||||
ce = g_malloc(sizeof(struct conntab_entry));
|
||||
ce->refcount = 0;
|
||||
@@ -3354,7 +3354,7 @@ static int sshfs_truncate(const char *path, off_t size,
|
||||
sshfs_inc_modifver();
|
||||
if (sshfs.truncate_workaround)
|
||||
return sshfs_truncate_workaround(path, size, fi);
|
||||
|
||||
|
||||
buf_init(&buf, 0);
|
||||
|
||||
if (sf != NULL)
|
||||
@@ -3397,7 +3397,7 @@ static int sshfs_getattr(const char *path, struct stat *stbuf,
|
||||
buf_add_buf(&buf, &sf->handle);
|
||||
err = sftp_request(sf->conn, SSH_FXP_FSTAT, &buf,
|
||||
SSH_FXP_ATTRS, &outbuf);
|
||||
}
|
||||
}
|
||||
if (!err) {
|
||||
err = buf_get_attrs(&outbuf, stbuf, NULL);
|
||||
#ifdef __APPLE__
|
||||
|
||||
@@ -190,17 +190,17 @@ Options
|
||||
directory cache holds the names of directory entries. Enabling it
|
||||
allows `readdir(3)` system calls to be processed without network
|
||||
access.
|
||||
|
||||
|
||||
-o dcache_max_size=N
|
||||
sets the maximum size of the directory cache.
|
||||
|
||||
|
||||
-o dcache_timeout=N
|
||||
sets timeout for directory cache in seconds.
|
||||
|
||||
|
||||
-o dcache_{stat,link,dir}_timeout=N
|
||||
sets separate timeout for {attributes, symlinks, names} in the
|
||||
directory cache.
|
||||
|
||||
|
||||
-o dcache_clean_interval=N
|
||||
sets the interval for automatic cleaning of the directory cache.
|
||||
|
||||
@@ -209,17 +209,17 @@ Options
|
||||
when full.
|
||||
|
||||
-o direct_io
|
||||
This option disables the use of page cache (file content cache) in
|
||||
This option disables the use of page cache (file content cache) in
|
||||
the kernel for this filesystem.
|
||||
This has several affects:
|
||||
|
||||
1. Each read() or write() system call will initiate one or more read or
|
||||
write operations, data will not be cached in the kernel.
|
||||
|
||||
2. The return value of the read() and write() system calls will correspond
|
||||
to the return values of the read and write operations. This is useful
|
||||
2. The return value of the read() and write() system calls will correspond
|
||||
to the return values of the read and write operations. This is useful
|
||||
for example if the file size is not known in advance (before reading it).
|
||||
e.g. /proc filesystem
|
||||
e.g. /proc filesystem
|
||||
|
||||
-o max_conns=N
|
||||
sets the maximum number of simultaneous SSH connections
|
||||
@@ -274,7 +274,7 @@ SSHFS hangs for no apparent reason
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In some cases, attempts to access the SSHFS mountpoint may freeze if
|
||||
no filesystem activity has occured for some time. This is typically
|
||||
no filesystem activity has occurred for some time. This is typically
|
||||
caused by the SSH connection being dropped because of inactivity
|
||||
without SSHFS being informed about that. As a workaround, you can try
|
||||
to mount with ``-o ServerAliveInterval=15``. This will force the SSH
|
||||
@@ -311,7 +311,7 @@ interrupted.
|
||||
Mounting from /etc/fstab
|
||||
========================
|
||||
|
||||
To mount an SSHFS filesystem from ``/etc/fstab``, simply use ``sshfs`
|
||||
To mount an SSHFS filesystem from ``/etc/fstab``, simply use ``sshfs``
|
||||
as the file system type. (For backwards compatibility, you may also
|
||||
use ``fuse.sshfs``).
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
machine=$(uname -m)
|
||||
mkdir build-$machine
|
||||
cd build-$machine
|
||||
mkdir "build-$machine"
|
||||
cd "build-$machine"
|
||||
meson ..
|
||||
ninja
|
||||
|
||||
Executable
+4
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
pip3 install --user pre-commit
|
||||
pre-commit run --all-files --show-diff-on-failure
|
||||
+1
-1
@@ -2,7 +2,7 @@ test_scripts = [ 'conftest.py', 'pytest.ini', 'test_sshfs.py',
|
||||
'util.py' ]
|
||||
custom_target('test_scripts', input: test_scripts,
|
||||
output: test_scripts, build_by_default: true,
|
||||
command: ['cp', '-fPp',
|
||||
command: ['cp', '-fPp',
|
||||
'@INPUT@', meson.current_build_dir() ])
|
||||
|
||||
# Provide something helpful when running 'ninja test'
|
||||
|
||||
+6
-6
@@ -35,15 +35,15 @@ def name_generator(__ctr=[0]):
|
||||
@pytest.mark.parametrize("sync_rd", (True, False))
|
||||
@pytest.mark.parametrize("multiconn", (True,False))
|
||||
def test_sshfs(tmpdir, debug, cache_timeout, sync_rd, multiconn, capfd):
|
||||
|
||||
|
||||
# Avoid false positives from debug messages
|
||||
#if debug:
|
||||
# capfd.register_output(r'^ unique: [0-9]+, error: -[0-9]+ .+$',
|
||||
# count=0)
|
||||
|
||||
# Avoid false positives from storing key for localhost
|
||||
# Avoid false positives from storing key for localhost
|
||||
capfd.register_output(r"^Warning: Permanently added 'localhost' .+", count=0)
|
||||
|
||||
|
||||
# Test if we can ssh into localhost without password
|
||||
try:
|
||||
res = subprocess.call(['ssh', '-o', 'KbdInteractiveAuthentication=no',
|
||||
@@ -80,12 +80,12 @@ def test_sshfs(tmpdir, debug, cache_timeout, sync_rd, multiconn, capfd):
|
||||
|
||||
if multiconn:
|
||||
cmdline += [ '-o', 'max_conns=3' ]
|
||||
|
||||
|
||||
new_env = dict(os.environ) # copy, don't modify
|
||||
|
||||
# Abort on warnings from glib
|
||||
new_env['G_DEBUG'] = 'fatal-warnings'
|
||||
|
||||
|
||||
mount_process = subprocess.Popen(cmdline, env=new_env)
|
||||
try:
|
||||
wait_for_mount(mount_process, mnt_dir)
|
||||
@@ -299,7 +299,7 @@ def tst_link(mnt_dir, cache_timeout):
|
||||
# we need to wait until the cached value has expired.
|
||||
if cache_timeout:
|
||||
safe_sleep(cache_timeout)
|
||||
|
||||
|
||||
fstat1 = os.lstat(name1)
|
||||
fstat2 = os.lstat(name2)
|
||||
for attr in ('st_mode', 'st_dev', 'st_uid', 'st_gid',
|
||||
|
||||
+11
-7
@@ -6,36 +6,40 @@ set -e
|
||||
# that we still need to fix
|
||||
export ASAN_OPTIONS="detect_leaks=0"
|
||||
|
||||
export LSAN_OPTIONS="suppressions=$(pwd)/test/lsan_suppress.txt"
|
||||
export LSAN_OPTIONS="suppressions=${PWD}/test/lsan_suppress.txt"
|
||||
export CC
|
||||
|
||||
TEST_CMD="python3 -m pytest --maxfail=99 test/"
|
||||
|
||||
# Standard build with Valgrind
|
||||
for CC in gcc clang; do
|
||||
mkdir build-${CC}; cd build-${CC}
|
||||
if [ ${CC} == 'gcc-6' ]; then
|
||||
(
|
||||
mkdir "build-${CC}"; cd "build-${CC}"
|
||||
if [ "${CC}" == 'gcc-6' ]; then
|
||||
build_opts='-D b_lundef=false'
|
||||
else
|
||||
build_opts=''
|
||||
fi
|
||||
# shellcheck disable=SC2086
|
||||
meson -D werror=true ${build_opts} ../
|
||||
ninja
|
||||
|
||||
TEST_WITH_VALGRIND=true ${TEST_CMD}
|
||||
cd ..
|
||||
)
|
||||
done
|
||||
(cd build-$CC; sudo ninja install)
|
||||
(cd "build-${CC}"; sudo ninja install)
|
||||
|
||||
# Sanitized build
|
||||
CC=clang
|
||||
for san in undefined address; do
|
||||
mkdir build-${san}; cd build-${san}
|
||||
(
|
||||
mkdir "build-${san}"
|
||||
cd "build-${san}"
|
||||
# b_lundef=false is required to work around clang
|
||||
# bug, cf. https://groups.google.com/forum/#!topic/mesonbuild/tgEdAXIIdC4
|
||||
meson -D b_sanitize=${san} -D b_lundef=false -D werror=true ..
|
||||
ninja
|
||||
${TEST_CMD}
|
||||
sudo ninja install
|
||||
cd ..
|
||||
)
|
||||
done
|
||||
|
||||
@@ -13,7 +13,7 @@ ninja
|
||||
sudo ninja install
|
||||
test -e /usr/local/lib/pkgconfig || sudo mkdir /usr/local/lib/pkgconfig
|
||||
sudo mv /usr/local/lib/*/pkgconfig/* /usr/local/lib/pkgconfig/
|
||||
ls -d1 /usr/local/lib/*-linux-gnu | sudo tee /etc/ld.so.conf.d/usrlocal.conf
|
||||
printf '%s\n' /usr/local/lib/*-linux-gnu | sudo tee /etc/ld.so.conf.d/usrlocal.conf
|
||||
sudo ldconfig
|
||||
|
||||
# Setup ssh
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ def cleanup(mount_process, mnt_dir):
|
||||
mount_process.wait(1)
|
||||
except subprocess.TimeoutExpired:
|
||||
mount_process.kill()
|
||||
|
||||
|
||||
|
||||
def umount(mount_process, mnt_dir):
|
||||
subprocess.check_call(['fusermount3', '-z', '-u', mnt_dir ])
|
||||
|
||||
Reference in New Issue
Block a user