/// <summary> /// Opens the specified file. /// </summary> /// <param name="path">The full path of the file to open.</param> /// <param name="mode">The file mode for the created stream.</param> /// <param name="access">The access permissions for the created stream.</param> /// <returns>The new stream.</returns> public override SparseStream OpenFile(string path, FileMode mode, FileAccess access) { try { Nfs3AccessPermissions requested; if (access == FileAccess.Read) { requested = Nfs3AccessPermissions.Read; } else if (access == FileAccess.ReadWrite) { requested = Nfs3AccessPermissions.Read | Nfs3AccessPermissions.Modify; } else { requested = Nfs3AccessPermissions.Modify; } if (mode == FileMode.Create || mode == FileMode.CreateNew || (mode == FileMode.OpenOrCreate && !FileExists(path))) { Nfs3FileHandle parent = GetParentDirectory(path); Nfs3SetAttributes setAttrs = new Nfs3SetAttributes(); setAttrs.Mode = NfsOptions.NewFilePermissions; setAttrs.SetMode = true; setAttrs.Size = 0; setAttrs.SetSize = true; Nfs3FileHandle handle = _client.Create(parent, Utilities.GetFileFromPath(path), mode != FileMode.Create, setAttrs); return(new Nfs3FileStream(_client, handle, access)); } else { Nfs3FileHandle handle = GetFile(path); Nfs3AccessPermissions actualPerms = _client.Access(handle, requested); if (actualPerms != requested) { throw new UnauthorizedAccessException(string.Format(CultureInfo.InvariantCulture, "Access denied opening '{0}'. Requested permission '{1}', got '{2}'", path, requested, actualPerms)); } Nfs3FileStream result = new Nfs3FileStream(_client, handle, access); if (mode == FileMode.Append) { result.Seek(0, SeekOrigin.End); } else if (mode == FileMode.Truncate) { result.SetLength(0); } return(result); } } catch (Nfs3Exception ne) { throw ConvertNfsException(ne); } }
public Nfs3AccessResult(XdrDataReader reader) { Status = (Nfs3Status)reader.ReadInt32(); if (reader.ReadBool()) { ObjectAttributes = new Nfs3FileAttributes(reader); } Access = (Nfs3AccessPermissions)reader.ReadInt32(); }
public Nfs3AccessPermissions Access(Nfs3FileHandle handle, Nfs3AccessPermissions requested) { Nfs3AccessResult result = _nfsClient.Access(handle, requested); if (result.ObjectAttributes != null) { _cachedAttributes[handle] = result.ObjectAttributes; } if (result.Status == Nfs3Status.Ok) { return(result.Access); } throw new Nfs3Exception(result.Status); }
public Nfs3AccessResult Access(Nfs3FileHandle handle, Nfs3AccessPermissions requested) { MemoryStream ms = new MemoryStream(); XdrDataWriter writer = StartCallMessage(ms, _client.Credentials, 4); handle.Write(writer); writer.Write((int)requested); RpcReply reply = DoSend(ms); if (reply.Header.IsSuccess) { return(new Nfs3AccessResult(reply.BodyReader)); } throw new RpcException(reply.Header.ReplyHeader); }
public Nfs3AccessPermissions Access(Nfs3FileHandle handle, Nfs3AccessPermissions requested) { Nfs3AccessResult result = _nfsClient.Access(handle, requested); if (result.ObjectAttributes != null) { _cachedAttributes[handle] = result.ObjectAttributes; } if (result.Status == Nfs3Status.Ok) { return result.Access; } else { throw new Nfs3Exception(result.Status); } }
public Nfs3AccessResult Access(Nfs3FileHandle handle, Nfs3AccessPermissions requested) { MemoryStream ms = new MemoryStream(); XdrDataWriter writer = StartCallMessage(ms, _client.Credentials, 4); handle.Write(writer); writer.Write((int)requested); RpcReply reply = DoSend(ms); if (reply.Header.IsSuccess) { return new Nfs3AccessResult(reply.BodyReader); } else { throw new RpcException(reply.Header.ReplyHeader); } }