/// <summary> /// Mounts a new file system. /// </summary> /// <param name="source">The source of the filesystem. This is usually a device name, but can also be another directory.</param> /// <param name="target">The path including the name of the mount point, where to mount the new filesystem.</param> public static void Mount(string source, string target) { // Retrieve the parent directory of the mount DirectoryEntry parent = PathResolver.Resolve(rootNode, ref target, PathResolutionFlags.RetrieveParent); if (parent == null) { throw new System.ArgumentException(); } IFileSystem root = FileSystemFactory.CreateFileSystem(source); if (root == null) { throw new System.ArgumentException(); } PathSplitter path = new PathSplitter(target); DirectoryEntry.Allocate(parent, path.Last, root.Root); }
/// <summary> /// Performs a standard path lookup. /// </summary> /// <param name="rootDirectory">The root directory.</param> /// <param name="path">The path to resolve.</param> /// <returns>The directory entry of the resolved path.</returns> /// <exception cref="System.Security.SecurityException">The caller does not have access to the path or a component. For example the caller does not have the right to traverse the path.</exception> /// <exception cref="System.IO.PathTooLongException">The path is too long to traverse. This can be the result of circular symbolic links in the path.</exception> /// <exception cref="System.IO.FileNotFoundException">The file or folder path not found.</exception> /// <exception cref="System.IO.DirectoryNotFoundException">A path component was not found.</exception> /// <remarks> /// This call my result in other exceptions not specified in the above list. Other exceptions can be thrown by IVfsNode implementations, which are visited during the traversal /// process. For example a network file system node may throw an exception, if the server is unreachable. /// </remarks> public static DirectoryEntry Resolve (DirectoryEntry rootDirectory, ref string path) { // FIXME: Remove the root argument. The filesystem root should be unique for a process as part of a security model similar to jails, e.g. give apps from // untrusted sources their private filesystem regions. // FIXME: Get the root from the thread execution block DirectoryEntry current = rootDirectory; PathResolver resolver = new PathResolver (rootDirectory, current); return resolver.Resolve (ref path, PathResolutionFlags.None); }
/// <summary> /// Performs a path lookup obeying to the passed flags. /// </summary> /// <param name="rootDirectory">The root directory.</param> /// <param name="path">The path to resolve.</param> /// <param name="flags">Controls aspects of the path lookup process.</param> /// <returns>The directory entry of the resolved path.</returns> /// <exception cref="System.Security.SecurityException">The caller does not have access to the path or a component. For example the caller does not have the right to traverse the path.</exception> /// <exception cref="System.IO.PathTooLongException">The path is too long to traverse. This can be the result of circular symbolic links in the path.</exception> /// <exception cref="System.IO.FileNotFoundException">The file or folder path was not found. This exception can be prevented by specifying PathResolutionFlags.DoNotThrowNotFoundException.</exception> /// <exception cref="System.IO.DirectoryNotFoundException">A path component was not found. This exception can be prevented by specifying PathResolutionFlags.DoNotThrowNotFoundException.</exception> /// <remarks> /// This call my result in other exceptions not specified in the above list. Other exceptions can be thrown by IVfsNode implementations, which are visited during the traversal /// process. For example a network file system node may throw an exception, if the server is unreachable. /// </remarks> public static DirectoryEntry Resolve (DirectoryEntry rootDirectory, ref string path, PathResolutionFlags flags) { // FIXME: Get the root from the thread execution block DirectoryEntry current = rootDirectory; PathResolver resolver = new PathResolver (rootDirectory, current); return resolver.Resolve (ref path, flags); }
/// <summary> /// Changes the current directory in the thread execution block. /// </summary> /// <param name="path">The path to change to. This path may be relative or absolute.</param> /// < public static void ChangeDirectory(string path) { DirectoryEntry entry = PathResolver.Resolve(rootNode, ref path); // FIXME: Set the current directory in the thread execution block }