1use crate::error::SshResult;
2use rand::rngs::OsRng;
3use rand::Rng;
4
5#[cfg(feature = "scp")]
6use crate::error::SshError;
7#[cfg(feature = "scp")]
8use std::{
9 path::Path,
10 str::FromStr,
11 time::{SystemTime, UNIX_EPOCH},
12};
13
14#[cfg(feature = "scp")]
15pub(crate) fn sys_time_to_secs(time: SystemTime) -> SshResult<u64> {
16 Ok(time.duration_since(UNIX_EPOCH)?.as_secs())
17}
18
19pub(crate) fn cookie() -> Vec<u8> {
21 let cookie: [u8; 16] = OsRng.gen();
22 cookie.to_vec()
23}
24
25pub(crate) fn vec_u8_to_string(v: Vec<u8>, pat: &str) -> SshResult<Vec<String>> {
26 let result = String::from_utf8(v)?;
27 let r: Vec<&str> = result.split(pat).collect();
28 let mut vec = vec![];
29 for x in r {
30 vec.push(x.to_owned())
31 }
32 Ok(vec)
33}
34
35#[cfg(feature = "scp")]
36pub(crate) fn check_path(path: &Path) -> SshResult<()> {
37 if path.to_str().is_none() {
38 return Err(SshError::InvalidScpFilePath);
39 }
40 Ok(())
41}
42
43#[cfg(feature = "scp")]
44pub(crate) fn file_time(v: Vec<u8>) -> SshResult<(i64, i64)> {
45 let mut t = vec![];
46 for x in v {
47 if x == b'T' || x == 32 || x == 10 {
48 continue;
49 }
50 t.push(x)
51 }
52 let a = t.len() / 2;
53 let ct = String::from_utf8(t[..(a - 1)].to_vec())?;
54 let ut = String::from_utf8(t[a..(t.len() - 1)].to_vec())?;
55 Ok((i64::from_str(&ct)?, i64::from_str(&ut)?))
56}