diff options
Diffstat (limited to 'src/sftpserver.c')
-rw-r--r-- | src/sftpserver.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/sftpserver.c b/src/sftpserver.c index 68fdb3d2..3cb30090 100644 --- a/src/sftpserver.c +++ b/src/sftpserver.c @@ -202,6 +202,29 @@ sftp_client_message sftp_get_client_message(sftp_session sftp) { return NULL; } break; + case SSH_FXP_EXTENDED: + rc = ssh_buffer_unpack(payload, + "s", + &msg->submessage); + if (rc != SSH_OK) { + ssh_set_error_oom(session); + sftp_client_message_free(msg); + return NULL; + } + + if (strcmp(msg->submessage, "hardlink@openssh.com") == 0 || + strcmp(msg->submessage, "posix-rename@openssh.com") == 0) { + rc = ssh_buffer_unpack(payload, + "sS", + &msg->filename, + &msg->data); + if (rc != SSH_OK) { + ssh_set_error_oom(session); + sftp_client_message_free(msg); + return NULL; + } + } + break; default: ssh_set_error(sftp->session, SSH_FATAL, "Received unhandled sftp message %d", msg->type); @@ -242,12 +265,17 @@ uint32_t sftp_client_message_get_flags(sftp_client_message msg){ return msg->flags; } +const char *sftp_client_message_get_submessage(sftp_client_message msg){ + return msg->submessage; +} + void sftp_client_message_free(sftp_client_message msg) { if (msg == NULL) { return; } SAFE_FREE(msg->filename); + SAFE_FREE(msg->submessage); ssh_string_free(msg->data); ssh_string_free(msg->handle); sftp_attributes_free(msg->attr); |