blob: b5f74ab284ceab0d7a2b5c9d795f752b7b6c4ea8 [file]
// Copyright 2025 Google
// SPDX-License-Identifier: MIT
use std::fs::File;
use std::io::Error;
use std::io::ErrorKind;
use std::io::Result;
use std::os::windows::io::AsRawHandle;
use std::os::windows::io::FromRawHandle;
use std::os::windows::io::IntoRawHandle;
use std::os::windows::io::OwnedHandle;
use std::os::windows::io::RawHandle;
use std::os::windows::raw::HANDLE;
use crate::descriptor::AsRawDescriptor;
use crate::descriptor::FromRawDescriptor;
use crate::descriptor::IntoRawDescriptor;
use crate::DescriptorType;
pub type RawDescriptor = RawHandle;
// Same as winapi::um::handleapi::INVALID_HANDLE_VALUE, but avoids compile issues.
pub const DEFAULT_RAW_DESCRIPTOR: RawDescriptor = -1isize as HANDLE;
pub struct OwnedDescriptor {
owned: OwnedHandle,
}
impl OwnedDescriptor {
pub fn try_clone(&self) -> Result<OwnedDescriptor> {
let clone = self.owned.try_clone()?;
Ok(OwnedDescriptor { owned: clone })
}
pub fn determine_type(&self) -> Result<DescriptorType> {
Err(Error::from(ErrorKind::Unsupported))
}
}
impl AsRawDescriptor for OwnedDescriptor {
fn as_raw_descriptor(&self) -> RawDescriptor {
self.owned.as_raw_handle()
}
}
impl FromRawDescriptor for OwnedDescriptor {
// SAFETY: It is caller's responsibility to ensure that the descriptor is valid.
unsafe fn from_raw_descriptor(descriptor: RawDescriptor) -> Self {
OwnedDescriptor {
owned: OwnedHandle::from_raw_handle(descriptor),
}
}
}
impl IntoRawDescriptor for OwnedDescriptor {
fn into_raw_descriptor(self) -> RawDescriptor {
self.owned.into_raw_handle()
}
}
impl IntoRawDescriptor for File {
fn into_raw_descriptor(self) -> RawDescriptor {
self.into_raw_handle()
}
}
impl From<File> for OwnedDescriptor {
fn from(f: File) -> OwnedDescriptor {
OwnedDescriptor { owned: f.into() }
}
}