Skip to main content

trussed_staging/
fs_info.rs

1// Copyright (C) Nitrokey GmbH
2// SPDX-License-Identifier: CC0-1.0
3
4use trussed::{
5    serde_extensions::ExtensionImpl, service::ServiceResources, store::Store, types::CoreContext,
6    Platform,
7};
8use trussed_core::Error;
9use trussed_fs_info::{
10    BlockInfo, FsInfoExtension, FsInfoExtensionReply, FsInfoExtensionRequest, FsInfoReply,
11};
12
13impl ExtensionImpl<FsInfoExtension> for super::StagingBackend {
14    fn extension_request<P: Platform>(
15        &mut self,
16        _core_ctx: &mut CoreContext,
17        _backend_ctx: &mut Self::Context,
18        request: &FsInfoExtensionRequest,
19        resources: &mut ServiceResources<P>,
20    ) -> Result<FsInfoExtensionReply, Error> {
21        match request {
22            FsInfoExtensionRequest::FsInfo(req) => {
23                let platform = resources.platform();
24                let store = platform.store();
25                let fs = store.fs(req.location);
26                Ok(FsInfoReply {
27                    block_info: Some(BlockInfo {
28                        total: fs.total_blocks(),
29                        available: fs.available_blocks().map_err(|_| Error::InternalError)?,
30                        size: fs.total_space() / fs.total_blocks(),
31                    }),
32                    available_space: fs.available_space().map_err(|_| Error::InternalError)?,
33                }
34                .into())
35            }
36        }
37    }
38}