mirror of https://github.com/ceph/go-ceph
cephfs: add Fstatx function to file type
Use the CephStatx type previously added to the library to implement a wrapper for the ceph_fstatx function. Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
parent
807eafb9d5
commit
80833a6789
|
@ -199,3 +199,27 @@ func (f *File) Fchown(user uint32, group uint32) error {
|
|||
ret := C.ceph_fchown(f.mount.mount, f.fd, C.int(user), C.int(group))
|
||||
return getError(ret)
|
||||
}
|
||||
|
||||
// Fstatx returns information about an open file.
|
||||
//
|
||||
// Implements:
|
||||
// int ceph_fstatx(struct ceph_mount_info *cmount, int fd, struct ceph_statx *stx,
|
||||
// unsigned int want, unsigned int flags);
|
||||
func (f *File) Fstatx(want StatxMask, flags AtFlags) (*CephStatx, error) {
|
||||
if err := f.validate(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var stx C.struct_ceph_statx
|
||||
ret := C.ceph_fstatx(
|
||||
f.mount.mount,
|
||||
f.fd,
|
||||
&stx,
|
||||
C.uint(want),
|
||||
C.uint(flags),
|
||||
)
|
||||
if err := getError(ret); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return cStructToCephStatx(stx), nil
|
||||
}
|
||||
|
|
|
@ -415,3 +415,63 @@ func TestFchown(t *testing.T) {
|
|||
err = f2.Fchown(bob, bob)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
func TestFstatx(t *testing.T) {
|
||||
fname := "test_fstatx.txt"
|
||||
|
||||
mount := fsConnect(t)
|
||||
defer fsDisconnect(t, mount)
|
||||
|
||||
f, err := mount.Open(fname, os.O_RDWR|os.O_CREATE, 0600)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
assert.NoError(t, f.Close())
|
||||
defer func() { assert.NoError(t, mount.Unlink(fname)) }()
|
||||
|
||||
t.Run("emptyFile", func(t *testing.T) {
|
||||
f, err := mount.Open(fname, os.O_RDWR, 0600)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
|
||||
st, err := f.Fstatx(StatxBasicStats, 0)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
|
||||
assert.Equal(t, uint16(0600), st.Mode&0600)
|
||||
assert.Equal(t, uint64(0), st.Size)
|
||||
})
|
||||
|
||||
t.Run("populateFile", func(t *testing.T) {
|
||||
f, err := mount.Open(fname, os.O_RDWR|os.O_CREATE, 0600)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
defer func() { assert.NoError(t, f.Close()) }()
|
||||
|
||||
_, err = f.Write([]byte("See spot run.\nSee spot jump.\n"))
|
||||
assert.NoError(t, err)
|
||||
|
||||
st, err := f.Fstatx(StatxBasicStats, 0)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
|
||||
assert.Equal(t, uint16(0600), st.Mode&0600)
|
||||
assert.Equal(t, uint64(29), st.Size)
|
||||
})
|
||||
|
||||
t.Run("closedFile", func(t *testing.T) {
|
||||
f, err := mount.Open(fname, os.O_RDWR|os.O_CREATE, 0600)
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, f)
|
||||
assert.NoError(t, f.Close())
|
||||
|
||||
st, err := f.Fstatx(StatxBasicStats, 0)
|
||||
assert.Error(t, err)
|
||||
assert.Nil(t, st)
|
||||
})
|
||||
|
||||
t.Run("invalidFile", func(t *testing.T) {
|
||||
f := &File{}
|
||||
_, err := f.Fstatx(StatxBasicStats, 0)
|
||||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue