diff options
-rw-r--r-- | include/libssh/sftp.h | 20 | ||||
-rw-r--r-- | libssh/sftp.c | 32 | ||||
-rw-r--r-- | sample.c | 118 |
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; @@ -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 */ |