コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }