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
104
105
106
107
108
109
110
111
112
#![forbid(unsafe_code)]
use std::{io, num::TryFromIntError, process::ExitStatus};
pub use awaitable_error::Error as AwaitableError;
pub use openssh_sftp_protocol_error::{
ErrMsg as SftpErrMsg, ErrorCode as SftpErrorKind, UnixTimeStampError,
};
pub use ssh_format_error::Error as SshFormatError;
use thiserror::Error as ThisError;
#[non_exhaustive]
#[derive(Debug, ThisError)]
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] SshFormatError),
#[error("Error when waiting for response: {0}.")]
AwaitableError(#[from] AwaitableError),
#[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(transparent)]
RecursiveErrors(Box<RecursiveError>),
#[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),
}
#[derive(Debug, ThisError)]
#[error("OriginalError: {original_error}, curr err raised when cleaning up: {occuring_error}.")]
pub struct RecursiveError {
pub original_error: Error,
#[source]
pub occuring_error: Error,
}