aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/libssh/sftp.h7
-rw-r--r--src/sftp.c26
2 files changed, 33 insertions, 0 deletions
diff --git a/include/libssh/sftp.h b/include/libssh/sftp.h
index 3750e0c6..774a4bac 100644
--- a/include/libssh/sftp.h
+++ b/include/libssh/sftp.h
@@ -853,6 +853,13 @@ LIBSSH_API sftp_session sftp_server_new(ssh_session session, ssh_channel chan);
* @return 0 on success, < 0 on error.
*/
LIBSSH_API int sftp_server_init(sftp_session sftp);
+
+/**
+ * @brief Close and deallocate a sftp server session.
+ *
+ * @param sftp The sftp session handle to free.
+ */
+LIBSSH_API void sftp_server_free(sftp_session sftp);
#endif /* WITH_SERVER */
/* this is not a public interface */
diff --git a/src/sftp.c b/src/sftp.c
index d5934527..a122c2c4 100644
--- a/src/sftp.c
+++ b/src/sftp.c
@@ -298,6 +298,32 @@ int sftp_server_init(sftp_session sftp){
return 0;
}
+
+void sftp_server_free(sftp_session sftp)
+{
+ sftp_request_queue ptr;
+
+ if (sftp == NULL) {
+ return;
+ }
+
+ ptr = sftp->queue;
+ while(ptr) {
+ sftp_request_queue old;
+ sftp_message_free(ptr->message);
+ old = ptr->next;
+ SAFE_FREE(ptr);
+ ptr = old;
+ }
+
+ SAFE_FREE(sftp->handles);
+ SSH_BUFFER_FREE(sftp->read_packet->payload);
+ SAFE_FREE(sftp->read_packet);
+
+ sftp_ext_free(sftp->ext);
+
+ SAFE_FREE(sftp);
+}
#endif /* WITH_SERVER */
void sftp_free(sftp_session sftp)