Add stat RPC (#614)

Add `Stat` RPC to vminitd.

`Stat` RPC is used to stat file system objects in the VM. It accepts the
path to the object (resolved against VM root) and returns the stat
result.
This commit is contained in:
jwhur authored and GitHub committed 2026-04-27 14:44:33 -07:00
1 parent 59f599eed5
commit b770cd2a02
8 files changed
+826

No files matched your search

+88
View File
@@ -0,0 +1,88 @@
//===----------------------------------------------------------------------===//
// Copyright © 2026 Apple Inc. and the Containerization project authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//===----------------------------------------------------------------------===//
/// A timestamp with second and nanosecond precision.
public struct TimeSpec: Sendable, Hashable {
/// Seconds since the Unix epoch.
public var seconds: Int64
/// Nanoseconds past the second.
public var nanoseconds: Int32
public init(seconds: Int64, nanoseconds: Int32) {
self.seconds = seconds
self.nanoseconds = nanoseconds
}
}
/// File metadata returned by a `stat` call.
public struct Stat: Sendable, Hashable {
/// ID of device containing file (`st_dev`).
public var dev: UInt64
/// Inode number (`st_ino`).
public var ino: UInt64
/// File type and mode (`st_mode`).
public var mode: UInt32
/// Number of hard links (`st_nlink`).
public var nlink: UInt64
/// User ID of owner (`st_uid`).
public var uid: UInt32
/// Group ID of owner (`st_gid`).
public var gid: UInt32
/// Device ID, if special file (`st_rdev`).
public var rdev: UInt64
/// Total size in bytes (`st_size`).
public var size: Int64
/// Preferred I/O block size (`st_blksize`).
public var blksize: Int64
/// Number of 512-byte blocks allocated (`st_blocks`).
public var blocks: Int64
/// Time of last access (`st_atim`).
public var atime: TimeSpec
/// Time of last modification (`st_mtim`).
public var mtime: TimeSpec
/// Time of last status change (`st_ctim`).
public var ctime: TimeSpec
public init(
dev: UInt64,
ino: UInt64,
mode: UInt32,
nlink: UInt64,
uid: UInt32,
gid: UInt32,
rdev: UInt64,
size: Int64,
blksize: Int64,
blocks: Int64,
atime: TimeSpec,
mtime: TimeSpec,
ctime: TimeSpec
) {
self.dev = dev
self.ino = ino
self.mode = mode
self.nlink = nlink
self.uid = uid
self.gid = gid
self.rdev = rdev
self.size = size
self.blksize = blksize
self.blocks = blocks
self.atime = atime
self.mtime = mtime
self.ctime = ctime
}
}