1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#![forbid(unsafe_code)]
use std::io;
use std::num::TryFromIntError;
use std::process::ExitStatus;
use thiserror::Error;
pub use awaitable;
pub use openssh_sftp_protocol;
pub use openssh_sftp_protocol::response::{ErrMsg as SftpErrMsg, ErrorCode as SftpErrorKind};
use openssh_sftp_protocol::ssh_format;
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum Error {
#[error("Server does not support sftp protocol v3: It only support sftp protocol newer than {version}.")]
UnsupportedSftpProtocol {
version: u32,
},
#[error("sftp server returned hello message of length {len}, which is longer than 4096.")]
SftpServerHelloMsgTooLong {
len: u32,
},
#[error("sftp-server run on remote server failed: {0}.")]
SftpServerFailure(ExitStatus),
#[error("Background task failed: {0}.")]
BackgroundTaskFailure(&'static &'static str),
#[error("Unsupported extension {0}.")]
UnsupportedExtension(&'static &'static str),
#[error("IO Error (Excluding `io::ErrorKind::WouldBlock`): {0}.")]
IOError(#[from] io::Error),
#[error("Failed to serialize/deserialize the message: {0}.")]
FormatError(#[from] ssh_format::Error),
#[error("Error when waiting for response: {0}.")]
AwaitableError(#[from] awaitable::Error),
#[error("Sftp protocol can only send and receive at most u32::MAX data in one request.")]
BufferTooLong(#[from] TryFromIntError),
#[error("The response id {response_id} is invalid.")]
InvalidResponseId {
response_id: u32,
},
#[error("(OriginalError, RecursiveError): {0:#?}.")]
RecursiveErrors(Box<(Error, Error)>),
#[error("Sftp server reported error kind {0:#?}, msg: {1}")]
SftpError(SftpErrorKind, SftpErrMsg),
#[error("Response from sftp server is invalid: {0}")]
InvalidResponse(
&'static &'static str,
),
#[error("Handle returned by server is longer than the limit 256 bytes specified in sftp v3")]
HandleTooLong,
#[error("Failed to join tokio task")]
TaskJoinError(#[from] tokio::task::JoinError),
}