commit: ef510023de45de4ef587f35846022f00945ef5bd
parent d635d9281ba10519821736ad91d2beddee5361ba
Author: Michael Forney <mforney@mforney.org>
Date: Sun, 23 Dec 2018 10:56:22 -0800
sshfs: Update to 3.5.1
Diffstat:
8 files changed, 106 insertions(+), 66 deletions(-)
diff --git a/pkg/sshfs/config.h b/pkg/sshfs/config.h
@@ -1,2 +1,2 @@
#define IDMAP_DEFAULT "none"
-#define PACKAGE_VERSION "3.5.0"
+#define PACKAGE_VERSION "3.5.1"
diff --git a/pkg/sshfs/patch/0002-Use-a-compact-array-and-free-list-for-requests.patch b/pkg/sshfs/patch/0002-Use-a-compact-array-and-free-list-for-requests.patch
@@ -1,4 +1,4 @@
-From 2948f0391fa23c4ec962b22e1814eced97bbea8a Mon Sep 17 00:00:00 2001
+From 43d45856c8712f2700c6008de28b27272345460b Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sun, 5 Jun 2016 17:25:36 -0700
Subject: [PATCH] Use a compact array and free list for requests
@@ -8,7 +8,7 @@ Subject: [PATCH] Use a compact array and free list for requests
1 file changed, 80 insertions(+), 45 deletions(-)
diff --git a/sshfs.c b/sshfs.c
-index 5ae54c5..6da5c9f 100644
+index 6abd8ea..5b328e3 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -171,6 +171,17 @@ struct request {
@@ -38,7 +38,7 @@ index 5ae54c5..6da5c9f 100644
pthread_mutex_t lock;
pthread_mutex_t lock_write;
int processing_thread_started;
-@@ -1168,12 +1179,6 @@ static int do_write(struct iovec *iov, size_t count)
+@@ -1169,12 +1180,6 @@ static int do_write(struct iovec *iov, size_t count)
return 0;
}
@@ -51,7 +51,7 @@ index 5ae54c5..6da5c9f 100644
static void buf_to_iov(const struct buffer *buf, struct iovec *iov)
{
iov->iov_base = buf->p;
-@@ -1266,6 +1271,43 @@ static void request_free(struct request *req)
+@@ -1267,6 +1272,43 @@ static void request_free(struct request *req)
g_free(req);
}
@@ -95,7 +95,7 @@ index 5ae54c5..6da5c9f 100644
static void chunk_free(struct read_chunk *chunk)
{
while (!list_empty(&chunk->reqs)) {
-@@ -1295,21 +1337,6 @@ static void chunk_put_locked(struct read_chunk *chunk)
+@@ -1296,21 +1338,6 @@ static void chunk_put_locked(struct read_chunk *chunk)
pthread_mutex_unlock(&sshfs.lock);
}
@@ -117,7 +117,7 @@ index 5ae54c5..6da5c9f 100644
static int process_one_request(void)
{
int res;
-@@ -1326,8 +1353,7 @@ static int process_one_request(void)
+@@ -1327,8 +1354,7 @@ static int process_one_request(void)
return -1;
pthread_mutex_lock(&sshfs.lock);
@@ -127,7 +127,7 @@ index 5ae54c5..6da5c9f 100644
if (req == NULL)
fprintf(stderr, "request %i not found\n", id);
else {
-@@ -1339,7 +1365,7 @@ static int process_one_request(void)
+@@ -1340,7 +1366,7 @@ static int process_one_request(void)
sshfs.outstanding_len <= sshfs.max_outstanding_len) {
pthread_cond_broadcast(&sshfs.outstanding_cond);
}
@@ -136,7 +136,7 @@ index 5ae54c5..6da5c9f 100644
}
pthread_mutex_unlock(&sshfs.lock);
if (req != NULL) {
-@@ -1400,6 +1426,9 @@ static void close_conn(void)
+@@ -1401,6 +1427,9 @@ static void close_conn(void)
static void *process_requests(void *data_)
{
@@ -146,7 +146,7 @@ index 5ae54c5..6da5c9f 100644
(void) data_;
while (1) {
-@@ -1410,7 +1439,20 @@ static void *process_requests(void *data_)
+@@ -1411,7 +1440,20 @@ static void *process_requests(void *data_)
pthread_mutex_lock(&sshfs.lock);
sshfs.processing_thread_started = 0;
close_conn();
@@ -168,7 +168,7 @@ index 5ae54c5..6da5c9f 100644
sshfs.connver ++;
sshfs.outstanding_len = 0;
pthread_cond_broadcast(&sshfs.outstanding_cond);
-@@ -1558,7 +1600,6 @@ static int sftp_error_to_errno(uint32_t error)
+@@ -1559,7 +1601,6 @@ static int sftp_error_to_errno(uint32_t error)
static void sftp_detect_uid()
{
int flags;
@@ -176,7 +176,7 @@ index 5ae54c5..6da5c9f 100644
uint32_t replid;
uint8_t type;
struct buffer buf;
-@@ -1568,7 +1609,7 @@ static void sftp_detect_uid()
+@@ -1569,7 +1610,7 @@ static void sftp_detect_uid()
buf_init(&buf, 5);
buf_add_string(&buf, ".");
buf_to_iov(&buf, &iov[0]);
@@ -185,7 +185,7 @@ index 5ae54c5..6da5c9f 100644
goto out;
buf_clear(&buf);
if (sftp_read(&type, &buf) == -1)
-@@ -1579,7 +1620,7 @@ static void sftp_detect_uid()
+@@ -1580,7 +1621,7 @@ static void sftp_detect_uid()
}
if (buf_get_uint32(&buf, &replid) == -1)
goto out;
@@ -194,7 +194,7 @@ index 5ae54c5..6da5c9f 100644
fprintf(stderr, "bad reply ID\n");
goto out;
}
-@@ -1616,7 +1657,6 @@ out:
+@@ -1617,7 +1658,6 @@ out:
static int sftp_check_root(const char *base_path)
{
int flags;
@@ -202,7 +202,7 @@ index 5ae54c5..6da5c9f 100644
uint32_t replid;
uint8_t type;
struct buffer buf;
-@@ -1628,7 +1668,7 @@ static int sftp_check_root(const char *base_path)
+@@ -1629,7 +1669,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]);
@@ -211,7 +211,7 @@ index 5ae54c5..6da5c9f 100644
goto out;
buf_clear(&buf);
if (sftp_read(&type, &buf) == -1)
-@@ -1639,7 +1679,7 @@ static int sftp_check_root(const char *base_path)
+@@ -1640,7 +1680,7 @@ static int sftp_check_root(const char *base_path)
}
if (buf_get_uint32(&buf, &replid) == -1)
goto out;
@@ -220,7 +220,7 @@ index 5ae54c5..6da5c9f 100644
fprintf(stderr, "bad reply ID\n");
goto out;
}
-@@ -1829,7 +1869,6 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
+@@ -1830,7 +1870,6 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
struct request **reqp)
{
int err;
@@ -228,7 +228,7 @@ index 5ae54c5..6da5c9f 100644
struct request *req = g_new0(struct request, 1);
req->want_reply = want_reply;
-@@ -1840,8 +1879,6 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
+@@ -1841,8 +1880,6 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
pthread_mutex_lock(&sshfs.lock);
if (begin_func)
begin_func(req);
@@ -237,7 +237,7 @@ index 5ae54c5..6da5c9f 100644
err = start_processing_thread();
if (err) {
pthread_mutex_unlock(&sshfs.lock);
-@@ -1852,21 +1889,24 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
+@@ -1853,21 +1890,24 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
while (sshfs.outstanding_len > sshfs.max_outstanding_len)
pthread_cond_wait(&sshfs.outstanding_cond, &sshfs.lock);
@@ -266,7 +266,7 @@ index 5ae54c5..6da5c9f 100644
pthread_mutex_unlock(&sshfs.lock);
if (!rmed && !want_reply) {
-@@ -2039,7 +2079,7 @@ static int sftp_readdir_send(struct request **req, struct buffer *handle)
+@@ -2040,7 +2080,7 @@ static int sftp_readdir_send(struct request **req, struct buffer *handle)
static int sshfs_req_pending(struct request *req)
{
@@ -275,7 +275,7 @@ index 5ae54c5..6da5c9f 100644
return 1;
else
return 0;
-@@ -3312,11 +3352,6 @@ static int processing_init(void)
+@@ -3313,11 +3353,6 @@ static int processing_init(void)
pthread_mutex_init(&sshfs.lock, NULL);
pthread_mutex_init(&sshfs.lock_write, NULL);
pthread_cond_init(&sshfs.outstanding_cond, NULL);
@@ -288,5 +288,5 @@ index 5ae54c5..6da5c9f 100644
}
--
-2.18.0
+2.19.2
diff --git a/pkg/sshfs/patch/0003-Use-bool-instead-of-gboolean.patch b/pkg/sshfs/patch/0003-Use-bool-instead-of-gboolean.patch
@@ -1,4 +1,4 @@
-From 42d9808d18233aa74321d02209a18739bd12c045 Mon Sep 17 00:00:00 2001
+From 5e41f6528f5793c37b988ca64f5dba42fe14e4da Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sun, 5 Jun 2016 17:28:40 -0700
Subject: [PATCH] Use bool instead of gboolean
@@ -8,7 +8,7 @@ Subject: [PATCH] Use bool instead of gboolean
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/sshfs.c b/sshfs.c
-index 6da5c9f..b604469 100644
+index 5b328e3..a244e97 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -18,6 +18,7 @@
@@ -19,7 +19,7 @@ index 6da5c9f..b604469 100644
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
-@@ -1901,7 +1902,7 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
+@@ -1902,7 +1903,7 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
err = -EIO;
if (sftp_send_iov(type, req->id, iov, count) == -1) {
@@ -29,5 +29,5 @@ index 6da5c9f..b604469 100644
pthread_mutex_lock(&sshfs.lock);
rmed = !!request_table_lookup(&sshfs.reqtab, req->id);
--
-2.18.0
+2.19.2
diff --git a/pkg/sshfs/patch/0004-Use-struct-list_head-instead-of-GList.patch b/pkg/sshfs/patch/0004-Use-struct-list_head-instead-of-GList.patch
@@ -1,4 +1,4 @@
-From 2a30977257b83a7711a29e6992b5f70919ac4df0 Mon Sep 17 00:00:00 2001
+From 856db868eade9967192bfd9e7a274bfa5b6c6d39 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sun, 5 Jun 2016 17:30:20 -0700
Subject: [PATCH] Use struct list_head instead of GList
@@ -8,10 +8,10 @@ Subject: [PATCH] Use struct list_head instead of GList
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/sshfs.c b/sshfs.c
-index b604469..a9dde7c 100644
+index a244e97..28fcaf4 100644
--- a/sshfs.c
+++ b/sshfs.c
-@@ -2089,14 +2089,14 @@ static int sshfs_req_pending(struct request *req)
+@@ -2090,14 +2090,14 @@ static int sshfs_req_pending(struct request *req)
static int sftp_readdir_async(struct buffer *handle, void *buf, off_t offset,
fuse_fill_dir_t filler)
{
@@ -29,7 +29,7 @@ index b604469..a9dde7c 100644
while (!done || outstanding) {
struct request *req;
struct buffer name;
-@@ -2111,16 +2111,14 @@ static int sftp_readdir_async(struct buffer *handle, void *buf, off_t offset,
+@@ -2112,16 +2112,14 @@ static int sftp_readdir_async(struct buffer *handle, void *buf, off_t offset,
break;
}
@@ -49,7 +49,7 @@ index b604469..a9dde7c 100644
outstanding--;
if (done) {
-@@ -2159,7 +2157,7 @@ static int sftp_readdir_async(struct buffer *handle, void *buf, off_t offset,
+@@ -2160,7 +2158,7 @@ static int sftp_readdir_async(struct buffer *handle, void *buf, off_t offset,
}
}
}
@@ -59,5 +59,5 @@ index b604469..a9dde7c 100644
return err;
}
--
-2.18.0
+2.19.2
diff --git a/pkg/sshfs/patch/0005-Use-standard-C-functions.patch b/pkg/sshfs/patch/0005-Use-standard-C-functions.patch
@@ -1,4 +1,4 @@
-From 4c05a5809a7c3bcda3c8a932c54b7e5f8afa1619 Mon Sep 17 00:00:00 2001
+From 5de918738fc0f3ee81d9928d89d4e5d0171b0c71 Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sun, 5 Jun 2016 17:42:29 -0700
Subject: [PATCH] Use standard C functions
@@ -8,10 +8,10 @@ Subject: [PATCH] Use standard C functions
1 file changed, 55 insertions(+), 36 deletions(-)
diff --git a/sshfs.c b/sshfs.c
-index d33a7c9..d8f2461 100644
+index 28fcaf4..4650372 100644
--- a/sshfs.c
+++ b/sshfs.c
-@@ -666,25 +666,25 @@ static inline void buf_add_path(struct buffer *buf, const char *path)
+@@ -667,25 +667,25 @@ static inline void buf_add_path(struct buffer *buf, const char *path)
if (sshfs.base_path[0]) {
if (path[1]) {
if (sshfs.base_path[strlen(sshfs.base_path)-1] != '/') {
@@ -47,7 +47,7 @@ index d33a7c9..d8f2461 100644
}
static int buf_check_get(struct buffer *buf, size_t len)
-@@ -1269,7 +1269,7 @@ static void request_free(struct request *req)
+@@ -1270,7 +1270,7 @@ static void request_free(struct request *req)
{
buf_free(&req->reply);
sem_destroy(&req->ready);
@@ -56,7 +56,7 @@ index d33a7c9..d8f2461 100644
}
static int request_table_insert(struct request_table *reqtab, struct request *req)
-@@ -1317,9 +1317,9 @@ static void chunk_free(struct read_chunk *chunk)
+@@ -1318,9 +1318,9 @@ static void chunk_free(struct read_chunk *chunk)
rreq = list_entry(chunk->reqs.prev, struct read_req, list);
list_del(&rreq->list);
buf_free(&rreq->data);
@@ -68,7 +68,7 @@ index d33a7c9..d8f2461 100644
}
static void chunk_put(struct read_chunk *chunk)
-@@ -1870,8 +1870,10 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
+@@ -1871,8 +1871,10 @@ static int sftp_request_send(uint8_t type, struct iovec *iov, size_t count,
struct request **reqp)
{
int err;
@@ -80,7 +80,7 @@ index d33a7c9..d8f2461 100644
req->want_reply = want_reply;
req->end_func = end_func;
req->data = data;
-@@ -2580,8 +2582,10 @@ static int sshfs_open_common(const char *path, mode_t mode,
+@@ -2581,8 +2583,10 @@ static int sshfs_open_common(const char *path, mode_t mode,
if (fi->flags & O_APPEND)
pflags |= SSH_FXF_APPEND;
@@ -93,7 +93,7 @@ index d33a7c9..d8f2461 100644
list_init(&sf->write_reqs);
pthread_cond_init(&sf->write_finished, NULL);
/* Assume random read after open */
-@@ -2625,7 +2629,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
+@@ -2626,7 +2630,7 @@ static int sshfs_open_common(const char *path, mode_t mode,
} else {
if (sshfs.dir_cache)
cache_invalidate(path);
@@ -102,7 +102,7 @@ index d33a7c9..d8f2461 100644
}
buf_free(&buf);
return err;
-@@ -2692,7 +2696,7 @@ static void sshfs_file_put(struct sshfs_file *sf)
+@@ -2693,7 +2697,7 @@ static void sshfs_file_put(struct sshfs_file *sf)
{
sf->refs--;
if (!sf->refs)
@@ -111,7 +111,7 @@ index d33a7c9..d8f2461 100644
}
static void sshfs_file_get(struct sshfs_file *sf)
-@@ -2762,9 +2766,11 @@ static void sshfs_read_begin(struct request *req)
+@@ -2763,9 +2767,11 @@ static void sshfs_read_begin(struct request *req)
static struct read_chunk *sshfs_send_read(struct sshfs_file *sf, size_t size,
off_t offset)
{
@@ -124,7 +124,7 @@ index d33a7c9..d8f2461 100644
pthread_cond_init(&chunk->sio.finished, NULL);
list_init(&chunk->reqs);
chunk->size = size;
-@@ -2778,7 +2784,9 @@ static struct read_chunk *sshfs_send_read(struct sshfs_file *sf, size_t size,
+@@ -2779,7 +2785,9 @@ static struct read_chunk *sshfs_send_read(struct sshfs_file *sf, size_t size,
struct read_req *rreq;
size_t bsize = size < sshfs.max_read ? size : sshfs.max_read;
@@ -135,7 +135,7 @@ index d33a7c9..d8f2461 100644
rreq->sio = &chunk->sio;
rreq->size = bsize;
buf_init(&rreq->data, 0);
-@@ -2849,7 +2857,7 @@ static int wait_chunk(struct read_chunk *chunk, char *buf, size_t size)
+@@ -2850,7 +2858,7 @@ static int wait_chunk(struct read_chunk *chunk, char *buf, size_t size)
size -= rreq->res;
list_del(&rreq->list);
buf_free(&rreq->data);
@@ -144,7 +144,7 @@ index d33a7c9..d8f2461 100644
}
}
-@@ -3472,9 +3480,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
+@@ -3473,9 +3481,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
switch (key) {
case FUSE_OPT_KEY_OPT:
if (is_ssh_opt(arg)) {
@@ -157,7 +157,7 @@ index d33a7c9..d8f2461 100644
return 0;
}
/* Pass through */
-@@ -3531,9 +3540,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
+@@ -3532,9 +3541,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
case KEY_PORT:
@@ -170,7 +170,7 @@ index d33a7c9..d8f2461 100644
return 0;
case KEY_COMPRESS:
-@@ -3541,9 +3551,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
+@@ -3542,9 +3552,10 @@ static int sshfs_opt_proc(void *data, const char *arg, int key,
return 0;
case KEY_CONFIGFILE:
@@ -183,7 +183,7 @@ index d33a7c9..d8f2461 100644
return 0;
default:
-@@ -3699,17 +3710,19 @@ static char *find_base_path(void)
+@@ -3700,17 +3711,19 @@ static char *find_base_path(void)
static char *fsname_escape_commas(char *fsnameold)
{
@@ -205,7 +205,7 @@ index d33a7c9..d8f2461 100644
return fsname;
}
-@@ -4046,15 +4059,20 @@ int main(int argc, char *argv[])
+@@ -4047,15 +4060,20 @@ int main(int argc, char *argv[])
else
sshfs.max_outstanding_len = ~0;
@@ -230,7 +230,7 @@ index d33a7c9..d8f2461 100644
ssh_add_arg(sshfs.host);
if (sshfs.sftp_server)
sftp_server = sshfs.sftp_server;
-@@ -4081,10 +4099,11 @@ int main(int argc, char *argv[])
+@@ -4082,10 +4100,11 @@ int main(int argc, char *argv[])
sshfs.max_write = 65536;
fsname = fsname_escape_commas(fsname);
@@ -246,5 +246,5 @@ index d33a7c9..d8f2461 100644
if(sshfs.dir_cache)
sshfs.op = cache_wrap(&sshfs_oper);
--
-2.18.0
+2.19.2
diff --git a/pkg/sshfs/patch/0007-Disable-uidmap-and-gidmap-support.patch b/pkg/sshfs/patch/0007-Disable-uidmap-and-gidmap-support.patch
@@ -1,4 +1,4 @@
-From 627abd981f6bdf770dd20caafcc72bfef802feac Mon Sep 17 00:00:00 2001
+From 423bb82f581600d4b06d8be0773295a19cc8ec6c Mon Sep 17 00:00:00 2001
From: Michael Forney <mforney@mforney.org>
Date: Sun, 5 Jun 2016 18:24:16 -0700
Subject: [PATCH] Disable uidmap and gidmap support
@@ -8,7 +8,7 @@ Subject: [PATCH] Disable uidmap and gidmap support
1 file changed, 16 insertions(+)
diff --git a/sshfs.c b/sshfs.c
-index 00e1115..ad21d56 100644
+index a38791b..79da9c5 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -248,10 +248,12 @@ struct sshfs {
@@ -24,7 +24,7 @@ index 00e1115..ad21d56 100644
unsigned max_read;
unsigned max_write;
unsigned ssh_ver;
-@@ -383,7 +385,9 @@ enum {
+@@ -384,7 +386,9 @@ enum {
enum {
IDMAP_NONE,
IDMAP_USER,
@@ -34,7 +34,7 @@ index 00e1115..ad21d56 100644
};
enum {
-@@ -404,7 +408,9 @@ static struct fuse_opt sshfs_opts[] = {
+@@ -405,7 +409,9 @@ static struct fuse_opt sshfs_opts[] = {
SSHFS_OPT("workaround=%s", workarounds, 0),
SSHFS_OPT("idmap=none", idmap, IDMAP_NONE),
SSHFS_OPT("idmap=user", idmap, IDMAP_USER),
@@ -44,7 +44,7 @@ index 00e1115..ad21d56 100644
SSHFS_OPT("uidfile=%s", uid_file, 0),
SSHFS_OPT("gidfile=%s", gid_file, 0),
SSHFS_OPT("nomap=ignore", nomap, NOMAP_IGNORE),
-@@ -549,6 +555,7 @@ static int list_empty(const struct list_head *head)
+@@ -550,6 +556,7 @@ static int list_empty(const struct list_head *head)
return head->next == head;
}
@@ -52,7 +52,7 @@ index 00e1115..ad21d56 100644
/* given a pointer to the uid/gid, and the mapping table, remap the
* uid/gid, if necessary */
static inline int translate_id(uint32_t *id, GHashTable *map)
-@@ -566,6 +573,7 @@ static inline int translate_id(uint32_t *id, GHashTable *map)
+@@ -567,6 +574,7 @@ static inline int translate_id(uint32_t *id, GHashTable *map)
abort();
}
}
@@ -60,7 +60,7 @@ index 00e1115..ad21d56 100644
static inline void buf_init(struct buffer *buf, size_t size)
{
-@@ -813,12 +821,14 @@ static int buf_get_attrs(struct buffer *buf, struct stat *stbuf, int *flagsp)
+@@ -814,12 +822,14 @@ static int buf_get_attrs(struct buffer *buf, struct stat *stbuf, int *flagsp)
if (sshfs.remote_uid_detected && uid == sshfs.remote_uid)
uid = sshfs.local_uid;
#endif /* __APPLE__ */
@@ -75,7 +75,7 @@ index 00e1115..ad21d56 100644
memset(stbuf, 0, sizeof(struct stat));
stbuf->st_mode = mode;
-@@ -2477,12 +2487,14 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
+@@ -2478,12 +2488,14 @@ static int sshfs_chown(const char *path, uid_t uid, gid_t gid,
if (sshfs.remote_uid_detected && uid == sshfs.local_uid)
uid = sshfs.remote_uid;
#endif /* __APPLE__ */
@@ -90,7 +90,7 @@ index 00e1115..ad21d56 100644
buf_init(&buf, 0);
if (sf == NULL)
-@@ -3749,6 +3761,7 @@ static int ssh_connect(void)
+@@ -3750,6 +3762,7 @@ static int ssh_connect(void)
return 0;
}
@@ -98,7 +98,7 @@ index 00e1115..ad21d56 100644
/* number of ':' separated fields in a passwd/group file that we care
* about */
#define IDMAP_FIELDS 3
-@@ -3923,6 +3936,7 @@ static inline void load_gid_map(void)
+@@ -3924,6 +3937,7 @@ static inline void load_gid_map(void)
{
read_id_map(sshfs.gid_file, &groupname_to_gid, "gid", &sshfs.gid_map, &sshfs.r_gid_map);
}
@@ -106,7 +106,7 @@ index 00e1115..ad21d56 100644
#ifdef __APPLE__
int main(int argc, char *argv[], __unused char *envp[], char **exec_path)
-@@ -4015,6 +4029,7 @@ int main(int argc, char *argv[])
+@@ -4016,6 +4030,7 @@ int main(int argc, char *argv[])
if (sshfs.idmap == IDMAP_USER)
sshfs.detect_uid = 1;
@@ -114,7 +114,7 @@ index 00e1115..ad21d56 100644
else if (sshfs.idmap == IDMAP_FILE) {
sshfs.uid_map = NULL;
sshfs.gid_map = NULL;
-@@ -4029,6 +4044,7 @@ int main(int argc, char *argv[])
+@@ -4030,6 +4045,7 @@ int main(int argc, char *argv[])
if (sshfs.gid_file)
load_gid_map();
}
@@ -123,5 +123,5 @@ index 00e1115..ad21d56 100644
free(sshfs.gid_file);
--
-2.18.0
+2.19.2
diff --git a/pkg/sshfs/rev b/pkg/sshfs/rev
@@ -1 +1 @@
-10
+11
diff --git a/pkg/sshfs/sshfs.1 b/pkg/sshfs/sshfs.1
@@ -145,6 +145,10 @@ for some additional information. Possible values are:
Emulate overwriting an existing file by deleting and
renaming.
.TP
+.B renamexdev
+Make rename fail with EXDEV instead of the default EPERM
+to allow moving files across remote filesystems.
+.TP
.B truncate
Work around servers that don\(aqt support truncate by
coping the whole file, truncating it locally, and sending it
@@ -156,6 +160,10 @@ using \fIstat\fP instead.
.TP
.B buflimit
Work around OpenSSH "buffer fillup" bug.
+.TP
+.B createmode
+Work around broken servers that produce an error when passing a
+non\-zero mode to create, by always passing a mode of 0.
.UNINDENT
.TP
.B \-o idmap=TYPE
@@ -278,7 +286,15 @@ workaround=rename\fP\&. However, in this case it is still possible that
someone (or something) recreates the destination file after SSHFS has
removed it, but before SSHFS had the time to rename the old file. In
this case, the rename will still fail.
-.SS SSHFS hangs
+.SS Permission denied when moving files across remote filesystems
+.sp
+Most SFTP servers return only a generic "failure" when failing to rename
+across filesystem boundaries (EXDEV). sshfs normally converts this generic
+failure to a permission denied error (EPERM). If the option \fB\-o
+workaround=renamexdev\fP is given, generic failures will be considered EXDEV
+errors which will make programs like \fImv(1)\fP attempt to actually move the
+file after the failed rename.
+.SS SSHFS hangs for no apparent reason
.sp
In some cases, attempts to access the SSHFS mountpoint may freeze if
no filesystem activity has occured for some time. This is typically
@@ -286,6 +302,30 @@ 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 \fB\-o ServerAliveInterval=15\fP\&. This will force the SSH
connection to stay alive even if you have no activity.
+.SS SSHFS hangs after the connection was interrupted
+.sp
+By default, network operations in SSHFS run without timeouts, mirroring the
+default behavior of SSH itself. As a consequence, if the connection to the
+remote host is interrupted (e.g. because a network cable was removed),
+operations on files or directories under the mountpoint will block until the
+connection is either restored or closed altogether (e.g. manually).
+Applications that try to access such files or directories will generally appear
+to "freeze" when this happens.
+.sp
+If it is acceptable to discard data being read or written, a quick workaround
+is to kill the responsible \fBsshfs\fP process, which will make any blocking
+operations on the mounted filesystem error out and thereby "unfreeze" the
+relevant applications. Note that force unmounting with \fBfusermount \-zu\fP, on
+the other hand, does not help in this case and will leave read/write operations
+in the blocking state.
+.sp
+For a more automatic solution, one can use the \fB\-o ServerAliveInterval=15\fP
+option mentioned above, which will drop the connection after not receiving a
+response for 3 * 15 = 45 seconds from the remote host. By also supplying \fB\-o
+reconnect\fP, one can ensure that the connection is re\-established as soon as
+possible afterwards. As before, this will naturally lead to loss of data that
+was in the process of being read or written at the time when the connection was
+interrupted.
.SH MOUNTING FROM /ETC/FSTAB
.sp
To mount an SSHFS filesystem from \fB/etc/fstab\fP, simply use \fBsshfs\(ga