This is a discussion on [PATCH] add statfs extension to sftp-server - openssh ; And while we are at it, can you please comment on these patches as well, originally submitted around one year ago. Oh, and I think we can agree, that the secsh-filexfer standardization is dead, so there's not much point in ...
And while we are at it, can you please comment on these patches as
well, originally submitted around one year ago.
Oh, and I think we can agree, that the secsh-filexfer standardization
is dead, so there's not much point in trying to support newer protocol
versions, which don't have statfs anyway.
Thanks,
Miklos
-----
This is needed to be able to support statfs operation on an SSH
filesystem (http://fuse.sourceforge.net/sshfs.html).
It uses and sends only those fields of struct statfs which are common
with struct statvfs as defined by POSIX, and which are shared among
most UNIX-like systems.
The SSH_FXP_EXTENDED message type is used, so this change is backward
compatible and conforms to the protocol specification.
Index: ssh/sftp-server.c
================================================== =================
--- ssh.orig/sftp-server.c 2006-08-19 16:24:17.000000000 +0200
+++ ssh/sftp-server.c 2006-08-19 16:49:03.000000000 +0200
@@ -19,6 +19,7 @@
#include
#include
#include
+#include
#include
#include
@@ -462,6 +463,24 @@ send_attrib(u_int32_t id, const Attrib *
buffer_free(&msg);
}
+static void
+send_statfs(u_int32_t id, struct statfs *st)
+{
+ Buffer msg;
+
+ buffer_init(&msg);
+ buffer_put_char(&msg, SSH2_FXP_EXTENDED_REPLY);
+ buffer_put_int(&msg, id);
+ buffer_put_int(&msg, st->f_bsize);
+ buffer_put_int64(&msg, st->f_blocks);
+ buffer_put_int64(&msg, st->f_bfree);
+ buffer_put_int64(&msg, st->f_bavail);
+ buffer_put_int64(&msg, st->f_files);
+ buffer_put_int64(&msg, st->f_ffree);
+ send_msg(&msg);
+ buffer_free(&msg);
+}
+
/* parse incoming */
static void
@@ -1049,6 +1068,25 @@ process_symlink(void)
}
static void
+process_extended_statfs(u_int32_t id)
+{
+ char *path;
+ struct statfs st;
+ int ret;
+
+ path = get_string(NULL);
+ debug3("request %u: statfs", id);
+ logit("statfs \"%s\"", path);
+
+ ret = statfs(path, &st);
+ if (ret == -1)
+ send_status(id, errno_to_portable(errno));
+ else
+ send_statfs(id, &st);
+ xfree(path);
+}
+
+static void
process_extended(void)
{
u_int32_t id;
@@ -1056,7 +1094,10 @@ process_extended(void)
id = get_int();
request = get_string(NULL);
- send_status(id, SSH2_FX_OP_UNSUPPORTED); /* MUST */
+ if (strcmp(request, "statfs@openssh.org") == 0)
+ process_extended_statfs(id);
+ else
+ send_status(id, SSH2_FX_OP_UNSUPPORTED); /* MUST */
xfree(request);
}
_______________________________________________
openssh-unix-dev mailing list
openssh-unix-dev@mindrot.org
https://lists.mindrot.org/mailman/li...enssh-unix-dev