X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fvfs%2Fopen.c;h=748d0f7e7a173189f4573479806db6102dda570b;hb=8cf9dc88c488ba959a211f1ec653a366d16e1531;hp=2bfb261232058562ed881b2be1cde57c7ea3cac2;hpb=015f48988e0ff398409d71dfc692005ab439490a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/vfs/open.c b/KernelLand/Kernel/vfs/open.c index 2bfb2612..748d0f7e 100644 --- a/KernelLand/Kernel/vfs/open.c +++ b/KernelLand/Kernel/vfs/open.c @@ -722,6 +722,30 @@ int VFS_OpenInode(Uint32 Mount, Uint64 Inode, int Mode) LEAVE_RET('x', VFS_int_CreateHandle(node, mnt, Mode)); } +int VFS_Reopen(int FD, const char *Path, int Flags) +{ + tVFS_Handle *h = VFS_GetHandle(FD); + if(!h) { + errno = EBADF; + return -1; + } + + int newf = VFS_Open(Path, Flags); + if( newf == -1 ) { + return -1; + } + + _CloseNode(h->Node); + _DereferenceMount(h->Mount, "Reopen"); + memcpy(h, VFS_GetHandle(newf), sizeof(*h)); + _ReferenceNode(h->Node); + _ReferenceMount(h->Mount, "Reopen"); + + VFS_Close(newf); + + return FD; +} + /** * \fn void VFS_Close(int FD) * \brief Closes an open file handle @@ -774,6 +798,8 @@ int VFS_DuplicateFD(int SrcFD, int DstFD) return -1; VFS_SetHandle(DstFD, src->Node, src->Mode); } + _ReferenceMount(src->Mount, "DuplicateFD"); + _ReferenceNode(src->Node); memcpy(VFS_GetHandle(DstFD), src, sizeof(tVFS_Handle)); return DstFD; }