add a environment variable to the direct session...

...that is used as a fallback if no explicit
tty is requested
This commit is contained in:
Christian Meissl 2021-06-28 10:44:36 +02:00 committed by Victor Berger
parent 3392c0c675
commit 453f33d5a4
1 changed files with 44 additions and 3 deletions

View File

@ -11,7 +11,8 @@
//! ### Initialization
//!
//! To initialize the session you may pass the path to any tty device, that shall be used.
//! If no path is given the tty used to start this compositor (if any) will be used.
//! If no path is given the tty used to start this compositor (if any) will be used unless
//! the [SMITHAY_DIRECT_TTY_ENV] environment variable is set.
//! A new session and its notifier will be returned.
//!
//! ```rust,no_run
@ -59,7 +60,8 @@ use nix::{
use std::{
fmt,
os::unix::io::RawFd,
path::Path,
path::{Path, PathBuf},
str::FromStr,
sync::{
atomic::{AtomicBool, Ordering},
Arc,
@ -68,6 +70,11 @@ use std::{
#[cfg(feature = "backend_udev")]
use udev::Device as UdevDevice;
/// This environment variable can be used to specify a tty path
/// that will be used in [DirectSession::new] in case no explicit
/// tty path has been provided.
pub const SMITHAY_DIRECT_TTY_ENV: &str = "SMITHAY_DIRECT_TTY";
#[allow(dead_code)]
mod tty {
ioctl_read_bad!(kd_get_mode, 0x4B3B, i16);
@ -185,7 +192,8 @@ impl fmt::Debug for DirectSessionNotifier {
impl DirectSession {
/// Tries to create a new session via the legacy virtual terminal interface.
///
/// If you do not provide a tty device path, it will try to open the currently active tty if any.
/// If you do not provide a tty device path, it will try to open the tty set
/// in the [SMITHAY_DIRECT_TTY_ENV] environment variable or if unset the currently active tty if any.
pub fn new<L>(tty: Option<&Path>, logger: L) -> Result<(DirectSession, DirectSessionNotifier), Error>
where
L: Into<Option<::slog::Logger>>,
@ -193,6 +201,39 @@ impl DirectSession {
let logger = crate::slog_or_fallback(logger)
.new(o!("smithay_module" => "backend_session", "session_type" => "direct/vt"));
let direct_path: PathBuf;
let tty = if tty.is_none() {
if let Ok(direct_tty) = std::env::var(SMITHAY_DIRECT_TTY_ENV) {
info!(
logger,
"{} is set in environment, trying to open {}", SMITHAY_DIRECT_TTY_ENV, &direct_tty
);
let path = PathBuf::from_str(&direct_tty);
match path {
Ok(path) => {
direct_path = path;
Some(direct_path.as_path())
}
Err(err) => {
warn!(
logger,
"Failed to parse {} with value \"{}\": {}",
SMITHAY_DIRECT_TTY_ENV,
direct_tty,
err
);
None
}
}
} else {
None
}
} else {
tty
};
let fd = tty
.map(|path| {
open(