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
//! The `NAME LIST (NLST)` command
//
// This command causes a directory listing to be sent from
// server to user site. The pathname should specify a
// directory or other system-specific file group descriptor; a
// null argument implies the current directory. The server
// will return a stream of names of files and no other
// information. The data will be transferred in ASCII or
// EBCDIC type over the data connection as valid pathname
// strings separated by <CRLF> or <NL>. (Again the user must
// ensure that the TYPE is correct.) This command is intended
// to return information that can be used by a program to
// further process the files automatically. For example, in
// the implementation of a "multiple get" function.
use crate::server::commands::Cmd;
use crate::server::error::FTPError;
use crate::server::reply::{Reply, ReplyCode};
use crate::server::CommandArgs;
use crate::storage;
use futures::future::Future;
use futures::sink::Sink;
use tokio;
pub struct Nlst;
impl<S, U> Cmd<S, U> for Nlst
where
U: Send + Sync + 'static,
S: 'static + storage::StorageBackend<U> + Sync + Send,
S::File: tokio_io::AsyncRead + Send,
S::Metadata: storage::Metadata,
{
fn execute(&self, args: &CommandArgs<S, U>) -> Result<Reply, FTPError> {
let mut session = args.session.lock()?;
let tx = match session.data_cmd_tx.take() {
Some(tx) => tx,
None => {
return Ok(Reply::new(ReplyCode::CantOpenDataConnection, "No data connection established"));
}
};
spawn!(tx.send(args.cmd.clone()));
Ok(Reply::new(ReplyCode::FileStatusOkay, "Sending directory list"))
}
}