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); } } }
public static unsafe void WriteFileHeader(FileHeader *header, VoronPathSetting path) { bool syncIsNeeded = false; var fd = Syscall.open(path.FullPath, OpenFlags.O_WRONLY | PerPlatformValues.OpenFlags.O_CREAT, FilePermissions.S_IWUSR | FilePermissions.S_IRUSR); try { if (fd == -1) { var err = Marshal.GetLastWin32Error(); Syscall.ThrowLastError(err, "when opening " + path); } int remaining = sizeof(FileHeader); FileInfo fi = new FileInfo(path.FullPath); if (fi.Length != remaining) { syncIsNeeded = true; } var ptr = ((byte *)header); while (remaining > 0) { var written = Syscall.write(fd, ptr, (ulong)remaining); if (written == -1) { var err = Marshal.GetLastWin32Error(); Syscall.ThrowLastError(err, "writing to " + path); } remaining -= (int)written; ptr += written; } if (Syscall.FSync(fd) == -1) { var err = Marshal.GetLastWin32Error(); Syscall.ThrowLastError(err, "FSync " + path); } if (syncIsNeeded) { Syscall.FsyncDirectoryFor(path.FullPath); } } finally { if (fd != -1) { Syscall.close(fd); fd = -1; } } }
public static unsafe void WriteFileHeader(FileHeader *header, string path) { var fd = Syscall.open(path, OpenFlags.O_WRONLY | OpenFlags.O_CREAT, FilePermissions.S_IWUSR | FilePermissions.S_IRUSR); try { if (fd == -1) { var err = Marshal.GetLastWin32Error(); ThrowLastError(err, "when opening " + path); } int remaining = sizeof(FileHeader); var ptr = ((byte *)header); while (remaining > 0) { var written = Syscall.write(fd, ptr, (ulong)remaining); if (written == -1) { var err = Marshal.GetLastWin32Error(); ThrowLastError(err, "writing to " + path); } remaining -= (int)written; ptr += written; } if (Syscall.fsync(fd) == -1) { var err = Marshal.GetLastWin32Error(); ThrowLastError(err, "fsync " + path); } if (CheckSyncDirectoryAllowed(path) && SyncDirectory(path) == -1) { var err = Marshal.GetLastWin32Error(); ThrowLastError(err, "fsync dir " + path); } } finally { if (fd != -1) { Syscall.close(fd); fd = -1; } } }