From f10dd7c135d37a5fb0d78610d5ece5807d01eb1f Mon Sep 17 00:00:00 2001 From: li_zan <371442490@qq.com> Date: Thu, 3 Jun 2021 20:35:42 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20A=E6=A0=B8proc=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=9C=A8echo=E6=A8=A1=E5=BC=8F=E4=B8=8B?= =?UTF-8?q?=E6=96=B0=E5=A2=9Ewrite=E7=9A=84=E5=8A=9F=E8=83=BD=20close:=20#?= =?UTF-8?q?I3T6MZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: li_zan <371442490@qq.com> --- fs/proc/os_adapt/proc_vfs.c | 64 ++++++++++++++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/fs/proc/os_adapt/proc_vfs.c b/fs/proc/os_adapt/proc_vfs.c index 6dec6452..92e2df7e 100644 --- a/fs/proc/os_adapt/proc_vfs.c +++ b/fs/proc/os_adapt/proc_vfs.c @@ -74,6 +74,51 @@ static int EntryMatch(const char *name, int len, const struct ProcDirEntry *pn) return !strncmp(name, pn->name, len); } +int VfsProcfsTruncate(struct Vnode *pVnode, off_t len) +{ + return 0; +} + +int VfsProcfsCreate(struct Vnode* parent, const char *name, int mode, struct Vnode **vnode) +{ + int ret; + struct Vnode *vp = NULL; + struct ProcDirEntry *curEntry = NULL; + + struct ProcDirEntry *parentEntry = VnodeToEntry(parent); + if (parentEntry == NULL) { + return -ENODATA; + } + + ret = VnodeAlloc(&g_procfsVops, &vp); + if (ret != 0) { + return -ENOMEM; + } + + curEntry = ProcCreate(name, mode, parentEntry, NULL); + if (curEntry == NULL) { + VnodeFree(vp); + return -ENODATA; + } + + vp->data = curEntry; + vp->type = curEntry->type; + if (vp->type == VNODE_TYPE_DIR) { + vp->mode = S_IFDIR | PROCFS_DEFAULT_MODE; + } else { + vp->mode = S_IFREG | PROCFS_DEFAULT_MODE; + } + + vp->vop = parent->vop; + vp->fop = parent->fop; + vp->parent = parent; + vp->originMount = parent->originMount; + + *vnode = vp; + + return LOS_OK; +} + int VfsProcfsRead(struct file *filep, char *buffer, size_t buflen) { ssize_t size; @@ -89,6 +134,21 @@ int VfsProcfsRead(struct file *filep, char *buffer, size_t buflen) return size; } +int VfsProcfsWrite(struct file *filep, const char *buffer, size_t buflen) +{ + ssize_t size; + struct ProcDirEntry *entry = NULL; + if ((filep == NULL) || (filep->f_vnode == NULL) || (buffer == NULL)) { + return -EINVAL; + } + + entry = VnodeToEntry(filep->f_vnode); + size = (ssize_t)WriteProcFile(entry, (void *)buffer, buflen); + filep->f_pos = entry->pf->fPos; + + return size; +} + int VfsProcfsLookup(struct Vnode *parent, const char *name, int len, struct Vnode **vpp) { if (parent == NULL || name == NULL || len <= 0 || vpp == NULL) { @@ -288,11 +348,13 @@ static struct VnodeOps g_procfsVops = { .Getattr = VfsProcfsStat, .Readdir = VfsProcfsReaddir, .Opendir = VfsProcfsOpendir, - .Closedir = VfsProcfsClosedir + .Closedir = VfsProcfsClosedir, + .Truncate = VfsProcfsTruncate }; static struct file_operations_vfs g_procfsFops = { .read = VfsProcfsRead, + .write = VfsProcfsWrite, .open = VfsProcfsOpen, .close = VfsProcfsClose };