mirror of
https://github.com/ceph/go-ceph
synced 2024-12-20 21:33:06 +00:00
d4079e3949
Add a Statx wrapper for ceph_statx. Add a type wrapping the statx status info that exposes the various fields from the C-struct. Add a type wrapping struct timespec, based on golang's x/sys, for the time fields in the struct. Note that the ceph struct is not the same as the linux statx struct. Signed-off-by: John Mulligan <jmulligan@redhat.com>
141 lines
4.6 KiB
Go
141 lines
4.6 KiB
Go
package cephfs
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lcephfs
|
|
#cgo CPPFLAGS: -D_FILE_OFFSET_BITS=64
|
|
#include <cephfs/libcephfs.h>
|
|
*/
|
|
import "C"
|
|
|
|
// StatxMask values contain bit-flags indicating what data should be
|
|
// populated by a statx-type call.
|
|
type StatxMask uint32
|
|
|
|
const (
|
|
// StatxMode requests the mode value be filled in.
|
|
StatxMode = StatxMask(C.CEPH_STATX_MODE)
|
|
// StatxNlink requests the nlink value be filled in.
|
|
StatxNlink = StatxMask(C.CEPH_STATX_NLINK)
|
|
// StatxUid requests the uid value be filled in.
|
|
StatxUid = StatxMask(C.CEPH_STATX_UID)
|
|
// StatxRdev requests the rdev value be filled in.
|
|
StatxRdev = StatxMask(C.CEPH_STATX_RDEV)
|
|
// StatxAtime requests the access-time value be filled in.
|
|
StatxAtime = StatxMask(C.CEPH_STATX_ATIME)
|
|
// StatxMtime requests the modified-time value be filled in.
|
|
StatxMtime = StatxMask(C.CEPH_STATX_MTIME)
|
|
// StatxIno requests the inode be filled in.
|
|
StatxIno = StatxMask(C.CEPH_STATX_INO)
|
|
// StatxSize requests the size value be filled in.
|
|
StatxSize = StatxMask(C.CEPH_STATX_SIZE)
|
|
// StatxBlocks requests the blocks value be filled in.
|
|
StatxBlocks = StatxMask(C.CEPH_STATX_BLOCKS)
|
|
// StatxBasicStats requests all the fields that are part of a
|
|
// traditional stat call.
|
|
StatxBasicStats = StatxMask(C.CEPH_STATX_BASIC_STATS)
|
|
// StatxBtime requests the birth-time value be filled in.
|
|
StatxBtime = StatxMask(C.CEPH_STATX_BTIME)
|
|
// StatxVersion requests the version value be filled in.
|
|
StatxVersion = StatxMask(C.CEPH_STATX_VERSION)
|
|
// StatxAllStats requests all known stat values be filled in.
|
|
StatxAllStats = StatxMask(C.CEPH_STATX_ALL_STATS)
|
|
)
|
|
|
|
// AtFlags represent flags to be passed to calls that control how files
|
|
// are used or referenced. For example, not following symlinks.
|
|
type AtFlags uint
|
|
|
|
const (
|
|
// AtNoAttrSync requests that the stat call only fetch locally-cached
|
|
// values if possible, avoiding round trips to a back-end server.
|
|
AtNoAttrSync = AtFlags(C.AT_NO_ATTR_SYNC)
|
|
// AtSymlinkNofollow indicates the call should not follow symlinks
|
|
// but operate on the symlink itself.
|
|
AtSymlinkNofollow = AtFlags(C.AT_SYMLINK_NOFOLLOW)
|
|
)
|
|
|
|
// NOTE: CephStatx fields are meant to be settable by the callers.
|
|
// This is the primary reason we use public fields and not accessors
|
|
// for the CephStatx type.
|
|
|
|
// CephStatx instances are returned by extended stat (statx) calls.
|
|
// Note that CephStatx results are similar to but not identical
|
|
// to (Linux) system statx results.
|
|
type CephStatx struct {
|
|
// Mask is a bitmask indicating what fields have been set.
|
|
Mask StatxMask
|
|
// Blksize represents the file system's block size.
|
|
Blksize uint32
|
|
// Nlink is the number of links for the file.
|
|
Nlink uint32
|
|
// Uid (user id) value for the file.
|
|
Uid uint32
|
|
// Gid (group id) value for the file.
|
|
Gid uint32
|
|
// Mode is the file's type and mode value.
|
|
Mode uint16
|
|
// Inode value for the file.
|
|
Inode Inode
|
|
// Size of the file in bytes.
|
|
Size uint64
|
|
// Blocks indicates the number of blocks allocated to the file.
|
|
Blocks uint64
|
|
// Dev describes the device containing this file system.
|
|
Dev uint64
|
|
// Rdev describes the device of this file, if the file is a device.
|
|
Rdev uint64
|
|
// Atime is the access time of this file.
|
|
Atime Timespec
|
|
// Ctime is the status change time of this file.
|
|
Ctime Timespec
|
|
// Mtime is the modification time of this file.
|
|
Mtime Timespec
|
|
// Btime is the creation (birth) time of this file.
|
|
Btime Timespec
|
|
// Version value for the file.
|
|
Version uint64
|
|
}
|
|
|
|
func cStructToCephStatx(s C.struct_ceph_statx) *CephStatx {
|
|
return &CephStatx{
|
|
Mask: StatxMask(s.stx_mask),
|
|
Blksize: uint32(s.stx_blksize),
|
|
Nlink: uint32(s.stx_nlink),
|
|
Uid: uint32(s.stx_uid),
|
|
Gid: uint32(s.stx_gid),
|
|
Mode: uint16(s.stx_mode),
|
|
Inode: Inode(s.stx_ino),
|
|
Size: uint64(s.stx_size),
|
|
Blocks: uint64(s.stx_blocks),
|
|
Dev: uint64(s.stx_dev),
|
|
Rdev: uint64(s.stx_rdev),
|
|
Atime: cStructToTimespec(s.stx_atime),
|
|
Ctime: cStructToTimespec(s.stx_ctime),
|
|
Mtime: cStructToTimespec(s.stx_mtime),
|
|
Btime: cStructToTimespec(s.stx_btime),
|
|
Version: uint64(s.stx_version),
|
|
}
|
|
}
|
|
|
|
/* TODO:
|
|
- enable later when we can test round -trips
|
|
- add time fields
|
|
|
|
func (c *CephStatx) toCStruct() C.struct_ceph_statx {
|
|
var s C.struct_ceph_statx
|
|
s.stx_mask = C.uint32_t(c.Mask)
|
|
s.stx_blksize = C.uint32_t(c.Blksize)
|
|
s.stx_nlink = C.uint32_t(c.Nlink)
|
|
s.stx_uid = C.uint32_t(c.Uid)
|
|
s.stx_gid = C.uint32_t(c.Gid)
|
|
s.stx_mode = C.uint16_t(c.Mode)
|
|
s.stx_ino = C.uint64_t(c.Inode)
|
|
s.stx_size = C.uint64_t(c.Size)
|
|
s.stx_blocks = C.uint64_t(c.Blocks)
|
|
s.stx_dev = C.uint64_t(c.Dev)
|
|
s.stx_rdev = C.uint64_t(c.Rdev)
|
|
s.stx_version = C.uint64_t(c.Version)
|
|
return s
|
|
}
|
|
*/
|