This new function just calls fstat() (if provided with a valid fd) or
stat() (if fd is -1) and returns st_size (or -1 if there is an
error). We may decide we want this function to be more complex, and
handle things like block devices - this is a placeholder (that works)
for any more complicated function.
---
Changes from V2:
* add fd arg and use it to optionally call fstat() instead of stat.
* return -1 unless it is a "regular file" (i.e. not a block device).
Is this what you were thinking of Eric?
src/libvirt_private.syms | 1 +
src/util/virfile.c | 34 ++++++++++++++++++++++++++++++++++
src/util/virfile.h | 1 +
3 files changed, 36 insertions(+)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7cc7bf8..ee59cae 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1578,6 +1578,7 @@ virFileIsLink;
virFileIsMountPoint;
virFileIsSharedFS;
virFileIsSharedFSType;
+virFileLength;
virFileLinkPointsTo;
virFileLock;
virFileLoopDeviceAssociate;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 1fb89ce..fcd0d92 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -1735,6 +1735,39 @@ virFileActivateDirOverride(const char *argv0)
}
}
+
+/**
+ * virFileLength:
+ * @path: full path of the file
+ * @fd: open file descriptor for file (or -1 to use @path)
+ *
+ * If fd >= 0, return the length of the open file indicated by @fd.
+ * If fd < 0 (i.e. -1) return the length of the file indicated by
+ * @path.
+ *
+ * Returns the length, or -1 if the file doesn't
+ * exist or its info was inaccessible. No error is logged.
+ */
+off_t
+virFileLength(const char *path, int fd)
+{
+ struct stat s;
+
+ if (fd >= 0) {
+ if (fstat(fd, &s) < 0)
+ return -1;
+ } else {
+ if (stat(path, &s) < 0)
+ return -1;
+ }
+
+ if (!S_ISREG(s.st_mode))
+ return -1;
+
+ return s.st_size;
+}
+
+
bool
virFileIsDir(const char *path)
{
diff --git a/src/util/virfile.h b/src/util/virfile.h
index b4ae6ea..836cc60 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -179,6 +179,7 @@ char *virFileFindResourceFull(const char *filename,
void virFileActivateDirOverride(const char *argv0)
ATTRIBUTE_NONNULL(1);
+off_t virFileLength(const char *path, int fd) ATTRIBUTE_NONNULL(1);
bool virFileIsDir (const char *file) ATTRIBUTE_NONNULL(1);
bool virFileExists(const char *file) ATTRIBUTE_NONNULL(1);
bool virFileIsExecutable(const char *file) ATTRIBUTE_NONNULL(1);
--
2.7.4