aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuentin Dufour <quentin@deuxfleurs.fr>2022-06-17 10:42:02 +0200
committerQuentin Dufour <quentin@deuxfleurs.fr>2022-06-17 10:42:02 +0200
commit212573b4b1b2a6ebe86a5ae0795433c85cfd2741 (patch)
treed02335ee36815f0e724f48b9c73d3577d7d89ccf
parent5599901b3b99700bee872877f88c8100f5e3ff47 (diff)
downloadaerogramme-212573b4b1b2a6ebe86a5ae0795433c85cfd2741.tar.gz
aerogramme-212573b4b1b2a6ebe86a5ae0795433c85cfd2741.zip
Handle CTRL+C for IMAP
-rw-r--r--src/server.rs32
-rw-r--r--src/session.rs5
2 files changed, 21 insertions, 16 deletions
diff --git a/src/server.rs b/src/server.rs
index 2c8fe8b..5e9eb26 100644
--- a/src/server.rs
+++ b/src/server.rs
@@ -11,11 +11,11 @@ use rusoto_signature::Region;
use tokio::sync::watch;
use tower::Service;
-use crate::service;
-use crate::lmtp::*;
use crate::config::*;
+use crate::lmtp::*;
use crate::login::{ldap_provider::*, static_provider::*, *};
use crate::mailbox::Mailbox;
+use crate::service;
pub struct Server {
lmtp_server: Option<Arc<LmtpServer>>,
@@ -38,7 +38,6 @@ impl Server {
})
}
-
pub async fn run(self) -> Result<()> {
//tracing::info!("Starting server on {:#}", self.imap.incoming.local_addr);
tracing::info!("Starting Aerogramme...");
@@ -49,21 +48,24 @@ impl Server {
let _ = provoke_exit.send(true);
};
-
- try_join!(async {
- match self.lmtp_server.as_ref() {
- None => Ok(()),
- Some(s) => s.run(exit_signal.clone()).await,
+ try_join!(
+ async {
+ match self.lmtp_server.as_ref() {
+ None => Ok(()),
+ Some(s) => s.run(exit_signal.clone()).await,
+ }
+ },
+ //@FIXME handle ctrl + c
+ async {
+ let mut must_exit = exit_signal.clone();
+ tokio::select! {
+ s = self.imap_server => s?,
+ _ = must_exit.changed() => tracing::info!("IMAP server received CTRL+C, exiting."),
+ }
+ Ok(())
}
- },
- //@FIXME handle ctrl + c
- async {
- self.imap_server.await?;
- Ok(())
- }
)?;
-
Ok(())
}
}
diff --git a/src/session.rs b/src/session.rs
index a3e4e24..a709986 100644
--- a/src/session.rs
+++ b/src/session.rs
@@ -84,7 +84,10 @@ pub struct Instance {
pub user: Option<User>,
}
impl Instance {
- fn new(login_provider: Arc<dyn LoginProvider + Send + Sync>, rx: mpsc::Receiver<Message>) -> Self {
+ fn new(
+ login_provider: Arc<dyn LoginProvider + Send + Sync>,
+ rx: mpsc::Receiver<Message>,
+ ) -> Self {
Self {
login_provider,
rx,