github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/kbfs/libdokan/profilelist.go (about) 1 // Copyright 2016 Keybase Inc. All rights reserved. 2 // Use of this source code is governed by a BSD 3 // license that can be found in the LICENSE file. 4 5 package libdokan 6 7 import ( 8 "runtime/pprof" 9 10 "github.com/keybase/client/go/kbfs/dokan" 11 "github.com/keybase/client/go/kbfs/libfs" 12 "golang.org/x/net/context" 13 ) 14 15 // TODO: Also have a file for CPU profiles. 16 17 // ProfileList is a node that can list all of the available profiles. 18 type ProfileList struct { 19 fs *FS 20 emptyFile 21 } 22 23 // GetFileInformation for dokan. 24 func (ProfileList) GetFileInformation(ctx context.Context, fi *dokan.FileInfo) (st *dokan.Stat, err error) { 25 return defaultDirectoryInformation() 26 } 27 28 // open tries to open a file. 29 func (pl ProfileList) open(ctx context.Context, oc *openContext, path []string) (dokan.File, dokan.CreateStatus, error) { 30 if len(path) == 0 { 31 return oc.returnDirNoCleanup(ProfileList{}) 32 } 33 if len(path) > 1 || !libfs.IsSupportedProfileName(path[0]) { 34 return nil, 0, dokan.ErrObjectNameNotFound 35 } 36 f := libfs.ProfileGet(path[0]) 37 if f == nil { 38 return nil, 0, dokan.ErrObjectNameNotFound 39 } 40 return oc.returnFileNoCleanup(&SpecialReadFile{read: f, fs: pl.fs}) 41 } 42 43 // FindFiles does readdir for dokan. 44 func (ProfileList) FindFiles(ctx context.Context, fi *dokan.FileInfo, ignored string, callback func(*dokan.NamedStat) error) (err error) { 45 // TODO: eventually this should use `libfs.ListProfileNames`, but 46 // first we have to figure out how to use the dokan API to handle 47 // the timed profiles (i.e., only read them once on open, and not 48 // trigger the timed wait on every read). 49 profiles := pprof.Profiles() 50 var ns dokan.NamedStat 51 ns.FileAttributes = dokan.FileAttributeReadonly 52 for _, p := range profiles { 53 ns.Name = p.Name() 54 if !libfs.IsSupportedProfileName(ns.Name) { 55 continue 56 } 57 err := callback(&ns) 58 if err != nil { 59 return err 60 } 61 } 62 return nil 63 }