Пример #1
0
		public static unsafe bool TryReadFileHeader(FileHeader* header, string path)
		{
			var fd = Syscall.open(path, OpenFlags.O_RDONLY, FilePermissions.S_IRUSR);
			try
			{
				if (fd == -1)
				{
					var lastError = Marshal.GetLastWin32Error();
					if (((Errno) lastError) == Errno.EACCES)
						return false;
					ThrowLastError(lastError);
				}
				int remaining = sizeof(FileHeader);
				var ptr = ((byte*)header);
				while (remaining > 0)
				{
					var read = Syscall.read(fd, ptr, (ulong)remaining);
					if (read == -1)
						ThrowLastError(Marshal.GetLastWin32Error());

					if (read == 0)
						return false;// truncated file?

					remaining -= (int)read;
					ptr += read;
				}
				return true;
			}
			finally
			{
				if (fd != -1)
					Syscall.close(fd);
			}
		}
Пример #2
0
		public static unsafe void WriteFileHeader(FileHeader* header, string path)
		{
			var fd = Syscall.open(path, OpenFlags.O_WRONLY | OpenFlags.O_CREAT,
			                      FilePermissions.ALLPERMS);
			try
			{
				if (fd == -1)
					ThrowLastError(Marshal.GetLastWin32Error());
				int remaining = sizeof(FileHeader);
				var ptr = ((byte*)header);
				while (remaining > 0)
				{
					var written = Syscall.write(fd, ptr, (ulong)remaining);
					if (written == -1)
						ThrowLastError(Marshal.GetLastWin32Error());

					remaining -= (int) written;
					ptr += written;
				}
				Syscall.fsync(fd);
			}
			finally
			{
				if (fd != -1)
					Syscall.close(fd);
			}
		}
Пример #3
0
 public static unsafe void WriteFileHeader(FileHeader* header, string path)
 {
     using (var fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
     {
         var ptr = (byte*)header;
         int remaining = sizeof(FileHeader);
         while (remaining > 0)
         {
             int read;
             if (Win32NativeFileMethods.WriteFile(fs.SafeFileHandle, ptr, remaining, out read, null) == false)
                 throw new Win32Exception();
             ptr += read;
             remaining -= read;
         }
         Win32NativeFileMethods.FlushFileBuffers(fs.SafeFileHandle);
     }
 }
Пример #4
0
        public static unsafe bool TryReadFileHeader(FileHeader* header, string path)
        {
            using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                if (fs.Length != sizeof(FileHeader))
                    return false; // wrong file size

                var ptr = (byte*)header;
                int remaining = sizeof(FileHeader);
                while (remaining > 0)
                {
                    int read;
                    if (Win32NativeFileMethods.ReadFile(fs.SafeFileHandle, ptr, remaining, out read, null) == false)
                        throw new Win32Exception();
                    if (read == 0)
                        return false; // we should be reading _something_ here, if we can't, then it is an error and we assume corruption
                    ptr += read;
                    remaining -= read;
                }
                return true;
            }
        }
		public unsafe abstract void WriteHeader(string filename, FileHeader* header);
			public override unsafe void WriteHeader(string filename, FileHeader* header)
			{
				if (Disposed)
					throw new ObjectDisposedException("PureMemoryStorageEnvironmentOptions");

				IntPtr ptr;
				if (_headers.TryGetValue(filename, out ptr) == false)
				{
					ptr = Marshal.AllocHGlobal(sizeof(FileHeader));
					_headers[filename] = ptr;
				}
                MemoryUtils.Copy((byte*)ptr, (byte*)header, sizeof(FileHeader));
			}
		public unsafe abstract bool ReadHeader(string filename, FileHeader* header);
			public override unsafe void WriteHeader(string filename, FileHeader* header)
			{
				var path = Path.Combine(_basePath, filename);
				if (RunningOnPosix)
					PosixHelper.WriteFileHeader(header, path);
				else
					Win32Helper.WriteFileHeader(header, path);
			}
			public unsafe override bool ReadHeader(string filename, FileHeader* header)
			{
				if(Disposed)
					throw new ObjectDisposedException("PureMemoryStorageEnvironmentOptions");
				IntPtr ptr;
				if (_headers.TryGetValue(filename, out ptr) == false)
				{
					return false;
				}
				*header = *((FileHeader*)ptr);
				return true;
			}
Пример #10
0
			public unsafe override bool ReadHeader(string filename, FileHeader* header)
			{
				var path = Path.Combine(_basePath, filename);
				if (File.Exists(path) == false)
				{
					return false;
				}
				if (RunningOnPosix)
					return PosixHelper.TryReadFileHeader(header, path);
				return Win32Helper.TryReadFileHeader(header, path);
			}
			public override unsafe void WriteHeader(string filename, FileHeader* header)
			{
				IntPtr ptr;
				if (_headers.TryGetValue(filename, out ptr) == false)
				{
					ptr = Marshal.AllocHGlobal(sizeof(FileHeader));
					_headers[filename] = ptr;
				}
				NativeMethods.memcpy((byte*)ptr, (byte*)header, sizeof(FileHeader));
			}
			public unsafe override bool ReadHeader(string filename, FileHeader* header)
			{
				IntPtr ptr;
				if (_headers.TryGetValue(filename, out ptr) == false)
				{
					return false;
				}
				*header = *((FileHeader*)ptr);
				return true;
			}
			public override unsafe void WriteHeader(string filename, FileHeader* header)
			{
				var path = Path.Combine(_basePath, filename);
				using (var fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
				{
					var ptr = (byte*)header;
					int remaining = sizeof(FileHeader);
					while (remaining > 0)
					{
						int read;
						if (NativeFileMethods.WriteFile(fs.SafeFileHandle, ptr, remaining, out read, null) == false)
							throw new Win32Exception();
						ptr += read;
						remaining -= read;
					}
					NativeFileMethods.FlushFileBuffers(fs.SafeFileHandle);
				}
			}
			public unsafe override bool ReadHeader(string filename, FileHeader* header)
			{
				var path = Path.Combine(_basePath, filename);
				if (File.Exists(path) == false)
				{
					return false;
				}
				using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
				{
				    if (fs.Length != sizeof (FileHeader))
				        return false; // wrong file size

				    var ptr = (byte*)header;
					int remaining = sizeof(FileHeader);
					while (remaining > 0)
					{
						int read;
						if (NativeFileMethods.ReadFile(fs.SafeFileHandle, ptr, remaining, out read, null) == false)
							throw new Win32Exception();
					    if (read == 0)
					        return false; // we should be reading _something_ here, if we can't, then it is an error and we assume corruption
						ptr += read;
						remaining -= read;
					}
					return true;
				}
			}