github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/shell/paths.go (about) 1 package shell 2 3 import ( 4 "os" 5 "path/filepath" 6 7 "github.com/markusbkk/elvish/pkg/daemon/daemondefs" 8 "github.com/markusbkk/elvish/pkg/fsutil" 9 "github.com/markusbkk/elvish/pkg/prog" 10 ) 11 12 func rcPath() (string, error) { 13 if legacyRC, exists := legacyDataPath("rc.elv", false); exists { 14 return legacyRC, nil 15 } 16 return newRCPath() 17 } 18 19 func libPaths() ([]string, error) { 20 paths, err := newLibPaths() 21 if legacyLib, exists := legacyDataPath("lib", true); exists { 22 paths = append(paths, legacyLib) 23 } 24 return paths, err 25 } 26 27 // Returns a SpawnConfig containing all the paths needed by the daemon. It 28 // respects overrides of sock and db from CLI flags. 29 func daemonPaths(p *prog.DaemonPaths) (*daemondefs.SpawnConfig, error) { 30 runDir, err := secureRunDir() 31 if err != nil { 32 return nil, err 33 } 34 sock := p.Sock 35 if sock == "" { 36 sock = filepath.Join(runDir, "sock") 37 } 38 39 db := p.DB 40 if db == "" { 41 var err error 42 db, err = dbPath() 43 if err != nil { 44 return nil, err 45 } 46 err = os.MkdirAll(filepath.Dir(db), 0700) 47 if err != nil { 48 return nil, err 49 } 50 } 51 return &daemondefs.SpawnConfig{DbPath: db, SockPath: sock, RunDir: runDir}, nil 52 } 53 54 func dbPath() (string, error) { 55 if legacyDB, exists := legacyDataPath("db", false); exists { 56 return legacyDB, nil 57 } 58 return newDBPath() 59 } 60 61 // Returns a path in the legacy data directory path, and whether it exists and 62 // matches the expected file/directory property. 63 func legacyDataPath(name string, dir bool) (string, bool) { 64 home, err := fsutil.GetHome("") 65 if err != nil { 66 return "", false 67 } 68 p := filepath.Join(home, ".elvish", name) 69 info, err := os.Stat(p) 70 if err != nil || info.IsDir() != dir { 71 return "", false 72 } 73 return p, true 74 }