sshfs stable port information

Package: sshfs
Version: 2.2
Revision: 2
Source: mirror:sourceforge:fuse/%n-fuse-%v.tar.gz
Source-MD5: 26e9206eb5169e87e6f95f54bc005a4f
PatchFile: %n.patch
PatchFile-MD5: 08330f4c10e25052b3a5c26d180e4752
BuildDepends: fuse-dev (>= 2.0-1), glib2-dev, pkgconfig, libgettext3-dev, fink (>= 0.24.12)
Depends: fuse-shlibs (>= 2.0-1), glib2-shlibs, libgettext3-shlibs

ConfigureParams: --disable-dependency-tracking
# pick up fuse_opt_parse
NoSetLDFLAGS: True
SetLDFLAGS: -L%p/lib -lfuse
CompileScript: CFLAGS="-g -O2 -DDARWIN_SEMAPHORE_COMPAT=1" ./configure --prefix=%p --libdir=%p/lib --disable-dependency-tracking
InstallScript: make DESTDIR=%d install
DocFiles: README COPYING NEWS FAQ.txt

Description: FUSE ssh filesystem
DescDetail: <<
This is a filesystem client based on the SSH File Transfer
Protocol. Since most SSH servers already support this protocol it is
very easy to set up: i.e. on the server side there's nothing to do.
On the client side mounting the filesystem is as easy as logging into
the server with ssh: "sshfs host: mountpoint"
<<
DescUsage: <<
Invoking sshfs with the options
-oreconnect,kill_on_unmount,volname="finder volume name"
will probably improve its interaction with the Finder.
<<
License: GPL
Homepage: http://fuse.sourceforge.net/sshfs.html
Maintainer: Brendan Cully

sshfs stable port .patch

diff -Naur old/Makefile.in new/Makefile.in
--- old/Makefile.in 2008-10-20 05:15:44.000000000 -0700
+++ new/Makefile.in 2008-10-21 15:46:00.000000000 -0700
@@ -660,7 +660,11 @@
@SSH_NODELAY_SO_TRUE@ rm -f "$(DESTDIR)$(libdir)/sshnodelay.so"

@SSH_NODELAY_SO_TRUE@sshnodelay.so:
+ifeq "$(shell uname)" "Darwin"
+@SSH_NODELAY_SO_TRUE@ $(CC) -Wall -dynamiclib $(CFLAGS) $(sshnodelay_libs) -install_name "$(DESTDIR)$(libdir)/sshnodelay.so" sshnodelay.c -o sshnodelay.so
+else
@SSH_NODELAY_SO_TRUE@ $(CC) -Wall -W -s --shared -fPIC $(sshnodelay_libs) sshnodelay.c -o sshnodelay.so
+endif
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:
diff -Naur old/README.MacFUSE new/README.MacFUSE
--- old/README.MacFUSE 1969-12-31 16:00:00.000000000 -0800
+++ new/README.MacFUSE 2008-10-21 15:46:00.000000000 -0700
@@ -0,0 +1,9 @@
+MacFUSE Project Page:
+
+http://code.google.com/p/macfuse/
+
+Making a Universal build of sshfs:
+
+0. Make sure dependencies (glib, MacFUSE) are installed
+1. Run macfuse_buildtool.sh -t swconfigure
+2. Run make
diff -Naur old/cache.c new/cache.c
--- old/cache.c 2008-10-20 05:10:08.000000000 -0700
+++ new/cache.c 2008-10-21 15:46:00.000000000 -0700
@@ -559,6 +559,9 @@
cache.next_oper = oper;

cache_unity_fill(oper, &cache_oper);
+#if (__FreeBSD__ >= 10)
+ cache_enabled = cache.on;
+#endif
if (cache.on) {
cache_fill(oper, &cache_oper);
pthread_mutex_init(&cache.lock, NULL);
@@ -593,3 +596,7 @@

return fuse_opt_parse(args, &cache, cache_opts, NULL);
}
+
+#if (__FreeBSD__ >= 10)
+int cache_enabled;
+#endif
diff -Naur old/cache.h new/cache.h
--- old/cache.h 2008-07-11 04:00:33.000000000 -0700
+++ new/cache.h 2008-10-21 15:46:00.000000000 -0700
@@ -27,3 +27,7 @@
void cache_add_attr(const char *path, const struct stat *stbuf, uint64_t wrctr);
void cache_invalidate(const char *path);
uint64_t cache_get_write_ctr(void);
+
+#if (__FreeBSD__ >= 10)
+extern int cache_enabled;
+#endif
diff -Naur old/sshfs.c new/sshfs.c
--- old/sshfs.c 2008-10-20 05:10:09.000000000 -0700
+++ new/sshfs.c 2008-10-21 15:48:09.000000000 -0700
@@ -19,7 +19,12 @@
#include
#include
#include
+#if !(__FreeBSD__ >= 10)
#include
+#else
+#define MACFUSE_SSHFS_VERSION "2.2.0"
+#include "fuse_darwin.h"
+#endif
#include
#include
#include
@@ -34,6 +39,10 @@
#include
#include
#include
+#if (__FreeBSD__ >= 10)
+#include
+#include
+#endif

#include "cache.h"

@@ -120,6 +129,16 @@

#define SSHNODELAY_SO "sshnodelay.so"

+#if (__FreeBSD__ >= 10)
+
+#ifndef LIBDIR
+#define LIBDIR "/usr/local/lib"
+#endif
+
+static char sshfs_program_path[PATH_MAX] = { 0 };
+
+#endif
+
struct buffer {
uint8_t *p;
size_t len;
@@ -169,6 +188,9 @@
int connver;
int modifver;
int refs;
+#if (__FreeBSD__ >= 10)
+ pthread_mutex_t file_lock;
+#endif
};

struct sshfs {
@@ -208,6 +230,10 @@
int server_version;
unsigned remote_uid;
unsigned local_uid;
+#if (__FreeBSD__ >= 10)
+ unsigned remote_gid;
+ unsigned local_gid;
+#endif
int remote_uid_detected;
unsigned blksize;
char *progname;
@@ -641,8 +667,17 @@
}
}

+#if (__FreeBSD__ >= 10)
+ if (sshfs.remote_uid_detected) {
+ if (uid == sshfs.remote_uid)
+ uid = sshfs.local_uid;
+ if (gid == sshfs.remote_gid)
+ gid = sshfs.local_gid;
+ }
+#else
if (sshfs.remote_uid_detected && uid == sshfs.remote_uid)
uid = sshfs.local_uid;
+#endif

memset(stbuf, 0, sizeof(struct stat));
stbuf->st_mode = mode;
@@ -745,11 +780,33 @@
#ifdef SSH_NODELAY_WORKAROUND
static int do_ssh_nodelay_workaround(void)
{
+#if (__FreeBSD__ >= 10)
+ char *oldpreload = getenv("DYLD_INSERT_LIBRARIES");
+#else
char *oldpreload = getenv("LD_PRELOAD");
+#endif
char *newpreload;
char sopath[PATH_MAX];
int res;

+#if (__FreeBSD__ >= 10)
+ 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
snprintf(sopath, sizeof(sopath), "%s/%s", LIBDIR, SSHNODELAY_SO);
res = access(sopath, R_OK);
if (res == -1) {
@@ -774,16 +831,24 @@
return -1;
}
}
+#if (__FreeBSD__ >= 10)
+pathok:
+#endif

newpreload = g_strdup_printf("%s%s%s",
oldpreload ? oldpreload : "",
oldpreload ? " " : "",
sopath);

+#if (__FreeBSD__ >= 10)
+ if (!newpreload || setenv("DYLD_INSERT_LIBRARIES", newpreload, 1) == -1)
+ fprintf(stderr, "warning: failed set DYLD_INSERT_LIBRARIES for ssh nodelay workaround\n");
+#else
if (!newpreload || setenv("LD_PRELOAD", newpreload, 1) == -1) {
fprintf(stderr, "warning: failed set LD_PRELOAD "
"for ssh nodelay workaround\n");
}
+#endif
g_free(newpreload);
return 0;
}
@@ -1476,6 +1541,10 @@

sshfs.remote_uid = stbuf.st_uid;
sshfs.local_uid = getuid();
+#if (__FreeBSD__ >= 10)
+ sshfs.remote_gid = stbuf.st_gid;
+ sshfs.local_gid = getgid();
+#endif
sshfs.remote_uid_detected = 1;
DEBUG("remote_uid = %i\n", sshfs.remote_uid);

@@ -2070,6 +2139,14 @@
buf_init(&buf, 0);
buf_add_path(&buf, path);
buf_add_uint32(&buf, SSH_FILEXFER_ATTR_UIDGID);
+#if (__FreeBSD__ >= 10)
+ if (sshfs.remote_uid_detected) {
+ if (uid == sshfs.local_uid)
+ uid = sshfs.remote_uid;
+ if (gid == sshfs.local_gid)
+ gid = sshfs.remote_gid;
+ }
+#endif
buf_add_uint32(&buf, uid);
buf_add_uint32(&buf, gid);
err = sftp_request(SSH_FXP_SETSTAT, &buf, SSH_FXP_STATUS, NULL);
@@ -2153,6 +2230,9 @@
sf = g_new0(struct sshfs_file, 1);
list_init(&sf->write_reqs);
pthread_cond_init(&sf->write_finished, NULL);
+#if (__FreeBSD__ >= 10)
+ pthread_mutex_init(&sf->file_lock, NULL);
+#endif
/* Assume random read after open */
sf->is_seq = 0;
sf->refs = 1;
@@ -2186,11 +2266,21 @@
}

if (!err) {
+#if (__FreeBSD__ >= 10)
+ if (cache_enabled)
+ cache_add_attr(path, &stbuf, wrctr);
+#else
cache_add_attr(path, &stbuf, wrctr);
+#endif
buf_finish(&sf->handle);
fi->fh = (unsigned long) sf;
} else {
+#if (__FreeBSD__ >= 10)
+ if (cache_enabled)
+ cache_invalidate(path);
+#else
cache_invalidate(path);
+#endif
g_free(sf);
}
buf_free(&buf);
@@ -2245,14 +2335,32 @@

static void sshfs_file_put(struct sshfs_file *sf)
{
+#if (__FreeBSD__ >= 10)
+ pthread_mutex_lock(&sf->file_lock);
+#endif
sf->refs--;
+#if (__FreeBSD__ >= 10)
+ if (!sf->refs) {
+ pthread_mutex_unlock(&sf->file_lock);
+ g_free(sf);
+ } else {
+ pthread_mutex_unlock(&sf->file_lock);
+ }
+#else
if (!sf->refs)
g_free(sf);
+#endif
}

static void sshfs_file_get(struct sshfs_file *sf)
{
+#if (__FreeBSD__ >= 10)
+ pthread_mutex_lock(&sf->file_lock);
+#endif
sf->refs++;
+#if (__FreeBSD__ >= 10)
+ pthread_mutex_unlock(&sf->file_lock);
+#endif
}

static int sshfs_release(const char *path, struct fuse_file_info *fi)
@@ -2942,7 +3050,12 @@
exit(1);

case KEY_VERSION:
+#if (__FreeBSD__ >= 10)
+ fprintf(stderr, "SSHFS version %s (MacFUSE SSHFS %s)\n",
+ PACKAGE_VERSION, MACFUSE_SSHFS_VERSION);
+#else
fprintf(stderr, "SSHFS version %s\n", PACKAGE_VERSION);
+#endif
#if FUSE_VERSION >= 25
fuse_opt_add_arg(outargs, "--version");
sshfs_fuse_main(outargs);
@@ -3026,6 +3139,15 @@
perror("Failed to allocate locked page for password");
return -1;
}
+#if (__FreeBSD__ >= 10)
+ 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;
+ }
+#endif /* __FreeBSD__ >= 10 */

/* Don't use fgets() because password might stay in memory */
for (n = 0; n < max_password; n++) {
@@ -3157,8 +3279,17 @@
}
#endif

+#if (__FreeBSD__ >= 10)
+int main(int argc, char *argv[], __unused char *envp[], char **exec_path)
+#else
int main(int argc, char *argv[])
+#endif
{
+#if (__FreeBSD__ >= 10)
+ if (!realpath(*exec_path, sshfs_program_path)) {
+ memset(sshfs_program_path, 0, PATH_MAX);
+ }
+#endif
int res;
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
char *tmp;
@@ -3167,6 +3298,10 @@
const char *sftp_server;
int libver;

+#if (__FreeBSD__ >= 10)
+ /* Until this gets fixed somewhere else. */
+ g_slice_set_config(G_SLICE_CONFIG_ALWAYS_MALLOC, TRUE);
+#endif /* __FreeBSD__ >= 10 */
g_thread_init(NULL);

sshfs.blksize = 4096;
@@ -3174,7 +3309,11 @@
sshfs.max_write = 65536;
sshfs.nodelay_workaround = 1;
sshfs.nodelaysrv_workaround = 0;
+#if (__FreeBSD__ >= 10)
+ sshfs.rename_workaround = 1;
+#else
sshfs.rename_workaround = 0;
+#endif /* __FreeBSD__ >= 10 */
sshfs.truncate_workaround = 0;
sshfs.buflimit_workaround = 1;
sshfs.ssh_ver = 2;
@@ -3187,6 +3326,10 @@
ssh_add_arg("-a");
ssh_add_arg("-oClearAllForwardings=yes");

+#if (__FreeBSD__ >= 10)
+ sshfs.detect_uid = 1;
+#endif
+
if (fuse_opt_parse(&args, &sshfs, sshfs_opts, sshfs_opt_proc) == -1 ||
parse_workarounds() == -1)
exit(1);
diff -Naur old/sshnodelay.c new/sshnodelay.c
--- old/sshnodelay.c 2007-12-11 14:23:29.000000000 -0800
+++ new/sshnodelay.c 2008-10-21 15:46:00.000000000 -0700
@@ -5,6 +5,32 @@
#include
#include

+#if (__FreeBSD__ >= 10)
+
+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)
+{
+ int res = 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;
+}
+
+#else
+
int connect(int sock, const struct sockaddr *addr, socklen_t addrlen)
{
int (*next_connect)(int, const struct sockaddr *, socklen_t) =
@@ -16,3 +42,5 @@
}
return res;
}
+
+#endif

sshfs _unstable_ port .patch