public string GetCompleteRealPath(string path) { if (path == null) { return(null); } try { var realPath = path; for (var links = 0; links < 32; links++) { var wasSymLink = TryFollowFirstSymbolicLink(ref realPath); if (!wasSymLink) { return(realPath); } } var ex = new UnixIOException(Errno.ELOOP); _logger.Warn("Failed to check for symlinks in the path {0}: {1}", path, ex.Message); return(path); } catch (Exception ex) { _logger.Debug(ex, "Failed to check for symlinks in the path {0}", path); return(path); } }
public bool TryCreateRefLink(string srcPath, string linkPath) { if (!_supported) { return(false); } try { using (var srcHandle = NativeMethods.open(srcPath, OpenFlags.O_RDONLY)) { if (srcHandle.IsInvalid) { _logger.Trace("Failed to create reflink at '{0}' to '{1}': Couldn't open source file", linkPath, srcPath); return(false); } using (var linkHandle = NativeMethods.open(linkPath, OpenFlags.O_WRONLY | OpenFlags.O_CREAT | OpenFlags.O_TRUNC)) { if (linkHandle.IsInvalid) { _logger.Trace("Failed to create reflink at '{0}' to '{1}': Couldn't create new link file", linkPath, srcPath); return(false); } if (NativeMethods.clone_file(linkHandle, srcHandle) == -1) { var error = new UnixIOException(); linkHandle.Dispose(); Syscall.unlink(linkPath); _logger.Trace("Failed to create reflink at '{0}' to '{1}': {2}", linkPath, srcPath, error.Message); return(false); } _logger.Trace("Created reflink at '{0}' to '{1}'", linkPath, srcPath); return(true); } } } catch (Exception ex) { Syscall.unlink(linkPath); _logger.Trace(ex, "Failed to create reflink at '{0}' to '{1}'", linkPath, srcPath); return(false); } }