From: John Hodge Date: Sun, 15 Nov 2009 13:03:08 +0000 (+0800) Subject: Added ChRoot Support (untested) X-Git-Tag: rel0.06~369 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=900f2d7853a5dd5d0f1a27c2374ecda434d6d866;p=tpg%2Facess2.git Added ChRoot Support (untested) --- diff --git a/Kernel/vfs/open.c b/Kernel/vfs/open.c index 50641ca3..7382a0c8 100644 --- a/Kernel/vfs/open.c +++ b/Kernel/vfs/open.c @@ -34,6 +34,8 @@ char *VFS_GetAbsPath(char *Path) char *tmpStr; int iPos = 0; int iPos2 = 0; + char *chroot = CFGPTR(CFG_VFS_CHROOT); + int chrootLen; char *cwd = CFGPTR(CFG_VFS_CWD); int cwdLen; @@ -52,14 +54,22 @@ char *VFS_GetAbsPath(char *Path) return ret; } + if( chroot == NULL ) { + chroot = ""; + chrootLen = 0; + } else { + chrootLen = strlen(chroot); + } + // Check if the path is already absolute if(Path[0] == '/') { - ret = malloc(pathLen + 1); + ret = malloc(chrootLen + pathLen + 1); if(!ret) { Warning("VFS_GetAbsPath - malloc() returned NULL"); return NULL; } - strcpy(ret, Path); + strcpy(ret, chroot); + strcpy(ret+chrootLen, Path); } else { if(cwd == NULL) { cwd = "/"; @@ -578,6 +588,55 @@ int VFS_ChDir(char *New) return 1; } +/** + * \fn int VFS_ChRoot(char *New) + * \brief Change current root directory + */ +int VFS_ChRoot(char *New) +{ + char *buf; + int fd; + tVFS_Handle *h; + + if(New[0] == '/' && New[1] == '\0') + return 1; // What a useless thing to ask! + + // Create Absolute + buf = VFS_GetAbsPath(New); + if(buf == NULL) { + LOG("Path expansion failed"); + return -1; + } + + // Check if path exists + fd = VFS_Open(buf, VFS_OPENFLAG_EXEC); + if(fd == -1) { + LOG("Path is invalid"); + return -1; + } + + // Get node so we can check for directory + h = VFS_GetHandle(fd); + if( !(h->Node->Flags & VFS_FFLAG_DIRECTORY) ) { + LOG("Path is not a directory"); + VFS_Close(fd); + return -1; + } + + // Close file + VFS_Close(fd); + + // Free old working directory + if( CFGPTR(CFG_VFS_CHROOT) ) + free( CFGPTR(CFG_VFS_CHROOT) ); + // Set new + CFGPTR(CFG_VFS_CHROOT) = buf; + + LOG("Updated Root to '%s'", buf); + + return 1; +} + /** * \fn tVFS_Handle *VFS_GetHandle(int FD) * \brief Gets a pointer to the handle information structure