aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2011-07-01 14:01:29 +0200
committerMiklos Szeredi <mszeredi@suse.cz>2011-07-01 14:01:29 +0200
commita575d482345235b71409c9627c1c8b0787dcde7c (patch)
treea36f5e992cedf8c693b989400e4b4f8cd2555ab2
parenteac5268e87a9ffeefaa5edcd40392e14cd5aa1e3 (diff)
downloadsshfs-a575d482345235b71409c9627c1c8b0787dcde7c.tar
sshfs-a575d482345235b71409c9627c1c8b0787dcde7c.tar.gz
sshfs-a575d482345235b71409c9627c1c8b0787dcde7c.tar.bz2
sshfs-a575d482345235b71409c9627c1c8b0787dcde7c.zip
Add hard link operation
Works if the server supports the "hardlink@openssh.com" protocol extension.
-rw-r--r--ChangeLog5
-rw-r--r--sshfs.c25
2 files changed, 30 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 3ce4ed3..78110b1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-07-01 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Add hard link operation. Works if the server supports the
+ "hardlink@openssh.com" protocol extension.
+
2011-03-25 Miklos Szeredi <miklos@szeredi.hu>
* Fix possible deadlock on reconnection. Reported by Florian
diff --git a/sshfs.c b/sshfs.c
index 739dbe3..22bda6b 100644
--- a/sshfs.c
+++ b/sshfs.c
@@ -104,6 +104,7 @@
#define SFTP_EXT_POSIX_RENAME "posix-rename@openssh.com"
#define SFTP_EXT_STATVFS "statvfs@openssh.com"
+#define SFTP_EXT_HARDLINK "hardlink@openssh.com"
#define PROTO_VERSION 3
@@ -217,6 +218,7 @@ struct sshfs {
char *password;
int ext_posix_rename;
int ext_statvfs;
+ int ext_hardlink;
mode_t mnt_mode;
/* statistics */
@@ -1377,6 +1379,9 @@ static int sftp_init_reply_ok(struct buffer *buf, uint32_t *version)
if (strcmp(ext, SFTP_EXT_STATVFS) == 0 &&
strcmp(extdata, "2") == 0)
sshfs.ext_statvfs = 1;
+ if (strcmp(ext, SFTP_EXT_HARDLINK) == 0 &&
+ strcmp(extdata, "1") == 0)
+ sshfs.ext_hardlink = 1;
} while (buf2.len < buf2.size);
}
return 0;
@@ -2076,6 +2081,25 @@ static int sshfs_rename(const char *from, const char *to)
return err;
}
+static int sshfs_link(const char *from, const char *to)
+{
+ int err = -ENOSYS;
+
+ if (sshfs.ext_hardlink) {
+ struct buffer buf;
+
+ buf_init(&buf, 0);
+ buf_add_string(&buf, SFTP_EXT_HARDLINK);
+ buf_add_path(&buf, from);
+ buf_add_path(&buf, to);
+ err = sftp_request(SSH_FXP_EXTENDED, &buf, SSH_FXP_STATUS,
+ NULL);
+ buf_free(&buf);
+ }
+
+ return err;
+}
+
static int sshfs_chmod(const char *path, mode_t mode)
{
int err;
@@ -2829,6 +2853,7 @@ static struct fuse_cache_operations sshfs_oper = {
.unlink = sshfs_unlink,
.rmdir = sshfs_rmdir,
.rename = sshfs_rename,
+ .link = sshfs_link,
.chmod = sshfs_chmod,
.chown = sshfs_chown,
.truncate = sshfs_truncate,