aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/sftp.h20
-rw-r--r--libssh/sftp.c32
-rw-r--r--sample.c118
3 files changed, 95 insertions, 75 deletions
diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h
index 347661d9..9d3647b8 100644
--- a/include/libssh/sftp.h
+++ b/include/libssh/sftp.h
@@ -262,6 +262,26 @@ LIBSSH_API const char *sftp_extensions_get_name(SFTP_SESSION *sftp, unsigned int
LIBSSH_API const char *sftp_extensions_get_data(SFTP_SESSION *sftp, unsigned int index);
/**
+ * @brief Check if the given extension is supported.
+ *
+ * @param sftp The sftp session to use.
+ *
+ * @param name The name of the extension.
+ *
+ * @param data The data of the extension.
+ *
+ * @return 1 if supported, 0 if not.
+ *
+ * Example:
+ *
+ * @code
+ * sftp_extension_supported(sftp, "statvfs@openssh.com", "2");
+ * @endcode
+ */
+LIBSSH_API int sftp_extension_supported(SFTP_SESSION *sftp, const char *name,
+ const char *data);
+
+/**
* @brief Open a directory used to obtain directory entries.
*
* @param session The sftp session handle to open the directory.
diff --git a/libssh/sftp.c b/libssh/sftp.c
index 2595dba0..250b753e 100644
--- a/libssh/sftp.c
+++ b/libssh/sftp.c
@@ -45,12 +45,6 @@
#define sftp_leave_function() _leave_function(sftp->channel->session)
struct sftp_ext_struct {
- int rename_openssh;
- int rename_openssh_version;
- int statvfs_openssh;
- int statvfs_openssh_version;
- int fstatvfs_openssh;
- int fstatvfs_openssh_version;
unsigned int count;
char **name;
char **data;
@@ -536,17 +530,6 @@ int sftp_init(SFTP_SESSION *sftp) {
"SFTP server extension: %s, version: %s",
ext_name, ext_data);
- if (strcmp(ext_name, "posix-rename@openssh.com") == 0) {
- sftp->ext->rename_openssh = 1;
- sftp->ext->rename_openssh_version = strtol(ext_data, (char **) NULL, 10);
- } else if (strcmp(ext_name, "statvfs@openssh.com") == 0) {
- sftp->ext->statvfs_openssh = 1;
- sftp->ext->statvfs_openssh_version = strtol(ext_data, (char **) NULL, 10);
- } else if (strcmp(ext_name, "fstatvfs@openssh.com") == 0) {
- sftp->ext->fstatvfs_openssh = 1;
- sftp->ext->fstatvfs_openssh_version = strtol(ext_data, (char **) NULL, 10);
- }
-
count++;
tmp = realloc(sftp->ext->name, count * sizeof(char *));
if (tmp == NULL) {
@@ -619,6 +602,21 @@ const char *sftp_extensions_get_data(SFTP_SESSION *sftp, unsigned int index) {
return sftp->ext->data[index];
}
+int sftp_extension_supported(SFTP_SESSION *sftp, const char *name,
+ const char *data) {
+ int i, n;
+
+ n = sftp_extensions_get_count(sftp);
+ for (i = 0; i < n; i++) {
+ if (strcmp(sftp_extensions_get_name(sftp, i), name) == 0 &&
+ strcmp(sftp_extensions_get_data(sftp, i), data) == 0) {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
static REQUEST_QUEUE *request_queue_new(SFTP_MESSAGE *msg) {
REQUEST_QUEUE *queue = NULL;
diff --git a/sample.c b/sample.c
index c114b529..c38f9c71 100644
--- a/sample.c
+++ b/sample.c
@@ -327,66 +327,68 @@ void do_sftp(SSH_SESSION *session){
sftp_unlink(sftp_session, "/tmp/sftp_symlink_test");
- sftpstatvfs = sftp_statvfs(sftp_session, "/tmp");
- if (sftpstatvfs == NULL) {
- fprintf(stderr, "statvfs failed (%s)\n", ssh_get_error(session));
- return;
- }
+ if (sftp_extension_supported(sftp_session, "statvfs@openssh.com", "2")) {
+ sftpstatvfs = sftp_statvfs(sftp_session, "/tmp");
+ if (sftpstatvfs == NULL) {
+ fprintf(stderr, "statvfs failed (%s)\n", ssh_get_error(session));
+ return;
+ }
- printf("sftp statvfs:\n"
- "\tfile system block size: %llu\n"
- "\tfundamental fs block size: %llu\n"
- "\tnumber of blocks (unit f_frsize): %llu\n"
- "\tfree blocks in file system: %llu\n"
- "\tfree blocks for non-root: %llu\n"
- "\ttotal file inodes: %llu\n"
- "\tfree file inodes: %llu\n"
- "\tfree file inodes for to non-root: %llu\n"
- "\tfile system id: %llu\n"
- "\tbit mask of f_flag values: %llu\n"
- "\tmaximum filename length: %llu\n",
- sftpstatvfs->f_bsize,
- sftpstatvfs->f_frsize,
- sftpstatvfs->f_blocks,
- sftpstatvfs->f_bfree,
- sftpstatvfs->f_bavail,
- sftpstatvfs->f_files,
- sftpstatvfs->f_ffree,
- sftpstatvfs->f_favail,
- sftpstatvfs->f_fsid,
- sftpstatvfs->f_flag,
- sftpstatvfs->f_namemax);
-
- sftp_statvfs_free(sftpstatvfs);
-
- if (statvfs("/tmp", &sysstatvfs) < 0) {
- fprintf(stderr, "statvfs failed (%s)\n", strerror(errno));
- return;
- }
+ printf("sftp statvfs:\n"
+ "\tfile system block size: %llu\n"
+ "\tfundamental fs block size: %llu\n"
+ "\tnumber of blocks (unit f_frsize): %llu\n"
+ "\tfree blocks in file system: %llu\n"
+ "\tfree blocks for non-root: %llu\n"
+ "\ttotal file inodes: %llu\n"
+ "\tfree file inodes: %llu\n"
+ "\tfree file inodes for to non-root: %llu\n"
+ "\tfile system id: %llu\n"
+ "\tbit mask of f_flag values: %llu\n"
+ "\tmaximum filename length: %llu\n",
+ sftpstatvfs->f_bsize,
+ sftpstatvfs->f_frsize,
+ sftpstatvfs->f_blocks,
+ sftpstatvfs->f_bfree,
+ sftpstatvfs->f_bavail,
+ sftpstatvfs->f_files,
+ sftpstatvfs->f_ffree,
+ sftpstatvfs->f_favail,
+ sftpstatvfs->f_fsid,
+ sftpstatvfs->f_flag,
+ sftpstatvfs->f_namemax);
+
+ sftp_statvfs_free(sftpstatvfs);
+
+ if (statvfs("/tmp", &sysstatvfs) < 0) {
+ fprintf(stderr, "statvfs failed (%s)\n", strerror(errno));
+ return;
+ }
- printf("sys statvfs:\n"
- "\tfile system block size: %llu\n"
- "\tfundamental fs block size: %llu\n"
- "\tnumber of blocks (unit f_frsize): %llu\n"
- "\tfree blocks in file system: %llu\n"
- "\tfree blocks for non-root: %llu\n"
- "\ttotal file inodes: %llu\n"
- "\tfree file inodes: %llu\n"
- "\tfree file inodes for to non-root: %llu\n"
- "\tfile system id: %llu\n"
- "\tbit mask of f_flag values: %llu\n"
- "\tmaximum filename length: %llu\n",
- sysstatvfs.f_bsize,
- sysstatvfs.f_frsize,
- sysstatvfs.f_blocks,
- sysstatvfs.f_bfree,
- sysstatvfs.f_bavail,
- sysstatvfs.f_files,
- sysstatvfs.f_ffree,
- sysstatvfs.f_favail,
- sysstatvfs.f_fsid,
- sysstatvfs.f_flag,
- sysstatvfs.f_namemax);
+ printf("sys statvfs:\n"
+ "\tfile system block size: %llu\n"
+ "\tfundamental fs block size: %llu\n"
+ "\tnumber of blocks (unit f_frsize): %llu\n"
+ "\tfree blocks in file system: %llu\n"
+ "\tfree blocks for non-root: %llu\n"
+ "\ttotal file inodes: %llu\n"
+ "\tfree file inodes: %llu\n"
+ "\tfree file inodes for to non-root: %llu\n"
+ "\tfile system id: %llu\n"
+ "\tbit mask of f_flag values: %llu\n"
+ "\tmaximum filename length: %llu\n",
+ sysstatvfs.f_bsize,
+ sysstatvfs.f_frsize,
+ sysstatvfs.f_blocks,
+ sysstatvfs.f_bfree,
+ sysstatvfs.f_bavail,
+ sysstatvfs.f_files,
+ sysstatvfs.f_ffree,
+ sysstatvfs.f_favail,
+ sysstatvfs.f_fsid,
+ sysstatvfs.f_flag,
+ sysstatvfs.f_namemax);
+ }
/* the connection is made */
/* opening a directory */