Example #1
0
        private static Result MountCodeImpl(this FileSystemClient fs, out CodeVerificationData verificationData,
                                            U8Span mountName, U8Span path, ProgramId programId)
        {
            Unsafe.SkipInit(out verificationData);

            Result rc = MountHelpers.CheckMountName(mountName);

            if (rc.IsFailure())
            {
                return(rc);
            }

            rc = FspPath.FromSpan(out FspPath fsPath, path);
            if (rc.IsFailure())
            {
                return(rc);
            }

            IFileSystemProxyForLoader fsProxy = fs.GetFileSystemProxyForLoaderServiceObject();

            rc = fsProxy.OpenCodeFileSystem(out IFileSystem codeFs, out verificationData, in fsPath, programId);
            if (rc.IsFailure())
            {
                return(rc);
            }

            return(fs.Register(mountName, codeFs));
        }
Example #2
0
        public static Result MountCode(this FileSystemClient fs, out CodeVerificationData verificationData,
                                       U8Span mountName, U8Span path, ProgramId programId)
        {
            Result rc;

            if (fs.IsEnabledAccessLog(AccessLogTarget.System))
            {
                TimeSpan startTime = fs.Time.GetCurrent();
                rc = MountCodeImpl(fs, out verificationData, mountName, path, programId);
                TimeSpan endTime = fs.Time.GetCurrent();

                fs.OutputAccessLog(rc, startTime, endTime,
                                   $", name: \"{mountName.ToString()}\", name: \"{path.ToString()}\", programid: 0x{programId}");
            }
            else
            {
                rc = MountCodeImpl(fs, out verificationData, mountName, path, programId);
            }

            if (rc.IsSuccess() && fs.IsEnabledAccessLog(AccessLogTarget.System))
            {
                fs.EnableFileSystemAccessorAccessLog(mountName);
            }

            return(rc);
        }
Example #3
0
            static Result Mount(FileSystemClient fs, out CodeVerificationData verificationData,
                                U8Span mountName, U8Span path, ProgramId programId)
            {
                UnsafeHelpers.SkipParamInit(out verificationData);

                Result rc = fs.Impl.CheckMountName(mountName);

                if (rc.IsFailure())
                {
                    return(rc);
                }

                if (path.IsNull())
                {
                    return(ResultFs.NullptrArgument.Log());
                }

                rc = FspPath.FromSpan(out FspPath fsPath, path);
                if (rc.IsFailure())
                {
                    return(rc);
                }

                using ReferenceCountedDisposable <IFileSystemProxyForLoader> fsProxy =
                          fs.Impl.GetFileSystemProxyForLoaderServiceObject();

                ReferenceCountedDisposable <IFileSystemSf> fileSystem = null;

                try
                {
                    rc = fsProxy.Target.OpenCodeFileSystem(out fileSystem, out verificationData, in fsPath, programId);
                    if (rc.IsFailure())
                    {
                        return(rc);
                    }

                    var fileSystemAdapter = new FileSystemServiceObjectAdapter(fileSystem);
                    return(fs.Register(mountName, fileSystemAdapter));
                }
                finally
                {
                    fileSystem?.Dispose();
                }
            }
Example #4
0
        public static Result MountCode(this FileSystemClient fs, out CodeVerificationData verificationData,
                                       U8Span mountName, U8Span path, ProgramId programId)
        {
            Result rc;

            if (fs.Impl.IsEnabledAccessLog(AccessLogTarget.System))
            {
                Tick start = fs.Hos.Os.GetSystemTick();
                rc = Mount(fs, out verificationData, mountName, path, programId);
                Tick end = fs.Hos.Os.GetSystemTick();

                Span <byte> logBuffer = stackalloc byte[0x300];
                var         sb        = new U8StringBuilder(logBuffer, true);

                sb.Append(LogName).Append(mountName).Append(LogQuote)
                .Append(LogPath).Append(path).Append(LogQuote)
                .Append(LogProgramId).AppendFormat(programId.Value, 'X');

                fs.Impl.OutputAccessLog(rc, start, end, null, new U8Span(sb.Buffer));
            }
            else
            {
                rc = Mount(fs, out verificationData, mountName, path, programId);
            }
            fs.Impl.AbortIfNeeded(rc);
            if (rc.IsFailure())
            {
                return(rc);
            }

            if (fs.Impl.IsEnabledAccessLog(AccessLogTarget.System))
            {
                fs.Impl.EnableFileSystemAccessorAccessLog(mountName);
            }

            return(Result.Success);
 public Result OpenCodeFileSystem(out ReferenceCountedDisposable <IFileSystem> fileSystem,
                                  out CodeVerificationData verificationData, in FspPath path, ProgramId programId)