asterinas/kernel/aster-nix/src/device/tty/device.rs

56 lines
1.4 KiB
Rust

// SPDX-License-Identifier: MPL-2.0
#![allow(unused_variables)]
use crate::{
events::IoEvents,
fs::{
device::{Device, DeviceId, DeviceType},
inode_handle::FileIo,
},
prelude::*,
process::signal::Poller,
};
/// Corresponds to `/dev/tty` in the file system. This device represents the controlling terminal
/// of the session of current process.
pub struct TtyDevice;
impl Device for TtyDevice {
fn open(&self) -> Result<Option<Arc<dyn FileIo>>> {
let current = current!();
let session = current.session().unwrap();
let Some(terminal) = session.terminal() else {
return_errno_with_message!(
Errno::ENOTTY,
"the session does not have controlling terminal"
);
};
Ok(Some(terminal as Arc<dyn FileIo>))
}
fn type_(&self) -> DeviceType {
DeviceType::CharDevice
}
fn id(&self) -> DeviceId {
DeviceId::new(5, 0)
}
}
impl FileIo for TtyDevice {
fn read(&self, writer: &mut VmWriter) -> Result<usize> {
return_errno_with_message!(Errno::EINVAL, "cannot read tty device");
}
fn write(&self, reader: &mut VmReader) -> Result<usize> {
return_errno_with_message!(Errno::EINVAL, "cannot write tty device");
}
fn poll(&self, mask: IoEvents, poller: Option<&mut Poller>) -> IoEvents {
IoEvents::empty()
}
}