github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/libfuse/special_files.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 //go:build !windows 6 // +build !windows 7 8 package libfuse 9 10 import ( 11 "time" 12 13 "bazil.org/fuse/fs" 14 "github.com/keybase/client/go/kbfs/libfs" 15 ) 16 17 // handleCommonSpecialFile handles special files that are present both 18 // within a TLF and outside a TLF. 19 func handleCommonSpecialFile( 20 name string, fs *FS, entryValid *time.Duration) fs.Node { 21 if name == libfs.ResetCachesFileName { 22 return &ResetCachesFile{fs} 23 } 24 25 return nil 26 } 27 28 // handleNonTLFSpecialFile handles special files that are outside a TLF, 29 // i.e. /keybase, /keybase/private, and /keybase/public. 30 func handleNonTLFSpecialFile( 31 name string, fs *FS, entryValid *time.Duration) fs.Node { 32 specialNode := handleCommonSpecialFile(name, fs, entryValid) 33 if specialNode != nil { 34 return specialNode 35 } 36 37 switch name { 38 case libfs.StatusFileName: 39 return NewNonTLFStatusFile(fs, entryValid) 40 case libfs.ProfileListDirName: 41 // Need to handle profiles explicitly here since we aren't 42 // using a wrapped file system with nodes for the 43 // root/folderlist directories. 44 return ProfileList{fs.config} 45 case libfs.MetricsFileName: 46 return NewMetricsFile(fs, entryValid) 47 case libfs.ErrorFileName: 48 return NewErrorFile(fs, entryValid) 49 case libfs.HumanErrorFileName, libfs.HumanNoLoginFileName: 50 *entryValid = 0 51 return &SpecialReadFile{fs.remoteStatus.NewSpecialReadFunc} 52 case libfs.EnableAutoJournalsFileName: 53 return &JournalControlFile{ 54 folder: &Folder{fs: fs}, // fake Folder for logging, etc. 55 action: libfs.JournalEnableAuto, 56 } 57 case libfs.DisableAutoJournalsFileName: 58 return &JournalControlFile{ 59 folder: &Folder{fs: fs}, // fake Folder for logging, etc. 60 action: libfs.JournalDisableAuto, 61 } 62 case libfs.EnableBlockPrefetchingFileName: 63 return &PrefetchFile{fs: fs, enable: true} 64 case libfs.DisableBlockPrefetchingFileName: 65 return &PrefetchFile{fs: fs, enable: false} 66 67 case libfs.EnableDebugServerFileName: 68 return &DebugServerFile{fs: fs, enable: true} 69 case libfs.DisableDebugServerFileName: 70 return &DebugServerFile{fs: fs, enable: false} 71 72 case libfs.EditHistoryName: 73 return NewUserEditHistoryFile(&Folder{fs: fs}, entryValid) 74 75 case libfs.OpenFileCountFileName: 76 return NewOpenFileCountFile(&Folder{fs: fs}, entryValid) 77 } 78 79 return nil 80 } 81 82 // handleTLFSpecialFile handles special files that are within a TLF. 83 func handleTLFSpecialFile( 84 name string, folder *Folder, entryValid *time.Duration) fs.Node { 85 specialNode := handleCommonSpecialFile(name, folder.fs, entryValid) 86 if specialNode != nil { 87 return specialNode 88 } 89 90 switch name { 91 case libfs.UnstageFileName: 92 return &UnstageFile{ 93 folder: folder, 94 } 95 96 case libfs.DisableUpdatesFileName: 97 return &UpdatesFile{ 98 folder: folder, 99 } 100 101 case libfs.EnableUpdatesFileName: 102 return &UpdatesFile{ 103 folder: folder, 104 enable: true, 105 } 106 107 case libfs.RekeyFileName: 108 return &RekeyFile{ 109 folder: folder, 110 } 111 112 case libfs.ReclaimQuotaFileName: 113 return &ReclaimQuotaFile{ 114 folder: folder, 115 } 116 117 case libfs.SyncFromServerFileName: 118 // Don't cache the node so that the next lookup of 119 // this file will force the dir to be re-checked 120 // (i.e., loadDirHelper will be called again). 121 *entryValid = 0 122 return &SyncFromServerFile{ 123 folder: folder, 124 } 125 126 case libfs.EnableJournalFileName: 127 return &JournalControlFile{ 128 folder: folder, 129 action: libfs.JournalEnable, 130 } 131 132 case libfs.FlushJournalFileName: 133 return &JournalControlFile{ 134 folder: folder, 135 action: libfs.JournalFlush, 136 } 137 138 case libfs.PauseJournalBackgroundWorkFileName: 139 return &JournalControlFile{ 140 folder: folder, 141 action: libfs.JournalPauseBackgroundWork, 142 } 143 144 case libfs.ResumeJournalBackgroundWorkFileName: 145 return &JournalControlFile{ 146 folder: folder, 147 action: libfs.JournalResumeBackgroundWork, 148 } 149 150 case libfs.DisableJournalFileName: 151 return &JournalControlFile{ 152 folder: folder, 153 action: libfs.JournalDisable, 154 } 155 156 case libfs.EnableSyncFileName: 157 return &SyncControlFile{ 158 folder: folder, 159 action: libfs.SyncEnable, 160 } 161 162 case libfs.DisableSyncFileName: 163 return &SyncControlFile{ 164 folder: folder, 165 action: libfs.SyncDisable, 166 } 167 } 168 169 return nil 170 }