summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/inc/kern/vnode.h25
-rw-r--r--sys/kern/vfs_subr.c50
2 files changed, 75 insertions, 0 deletions
diff --git a/sys/inc/kern/vnode.h b/sys/inc/kern/vnode.h
index b50042d..37b7127 100644
--- a/sys/inc/kern/vnode.h
+++ b/sys/inc/kern/vnode.h
@@ -78,6 +78,31 @@ struct vnode {
};
/*
+ * Read the contents of a file described by a vnode into
+ * a buffer
+ *
+ * @vp: Vnode to read
+ * @buf: Buffer to read file into
+ * @size: Number of bytes to read
+ * @off: Offset to read starting at
+ *
+ * Returns the number of bytes read
+ */
+ssize_t vnode_read(struct vnode *vp, void *buf, size_t size, off_t off);
+
+/*
+ * Write data into a file described by a vnode
+ *
+ * @vp: Vnode to write
+ * @buf: Buffer to write from
+ * @size: Length of data to write
+ * @off: Offset to write at
+ *
+ * Returns the number of bytes written
+ */
+ssize_t vnode_write(struct vnode *vp, const void *buf, size_t size, off_t off);
+
+/*
* Initialize a vnode by type
*
* @vp_res: Vnode pointer result
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 3fd8503..2c08f36 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -89,3 +89,53 @@ vnode_release(struct vnode *vp)
kfree(vp);
return 0;
}
+
+ssize_t
+vnode_read(struct vnode *vp, void *buf, size_t size, off_t off)
+{
+ struct vop_buf_args args;
+ struct vops *vops;
+
+ if (vp == NULL || buf == NULL) {
+ return -EINVAL;
+ }
+
+ if (size == 0) {
+ return -EINVAL;
+ }
+
+ vops = &vp->vops;
+ if (vops->read == NULL) {
+ return -ENOTSUP;
+ }
+
+ args.buffer = buf;
+ args.len = size;
+ args.offset = off;
+ return vops->read(&args);
+}
+
+ssize_t
+vnode_write(struct vnode *vp, const void *buf, size_t size, off_t off)
+{
+ struct vop_buf_args args;
+ struct vops *vops;
+
+ if (vp == NULL || buf == NULL) {
+ return -EINVAL;
+ }
+
+ if (size == 0) {
+ return -EINVAL;
+ }
+
+ vops = &vp->vops;
+ if (vops->write == NULL) {
+ return -ENOTSUP;
+ }
+
+ args.buffer = (void *)buf;
+ args.len = size;
+ args.offset = off;
+ return vops->write(&args);
+}