1// +build !windows
2
3package appdefaults
4
5import (
6	"os"
7	"path/filepath"
8	"strings"
9)
10
11const (
12	Address   = "unix:///run/buildkit/buildkitd.sock"
13	Root      = "/var/lib/buildkit"
14	ConfigDir = "/etc/buildkit"
15)
16
17// UserAddress typically returns /run/user/$UID/buildkit/buildkitd.sock
18func UserAddress() string {
19	//  pam_systemd sets XDG_RUNTIME_DIR but not other dirs.
20	xdgRuntimeDir := os.Getenv("XDG_RUNTIME_DIR")
21	if xdgRuntimeDir != "" {
22		dirs := strings.Split(xdgRuntimeDir, ":")
23		return "unix://" + filepath.Join(dirs[0], "buildkit", "buildkitd.sock")
24	}
25	return Address
26}
27
28// EnsureUserAddressDir sets sticky bit on XDG_RUNTIME_DIR if XDG_RUNTIME_DIR is set.
29// See https://github.com/opencontainers/runc/issues/1694
30func EnsureUserAddressDir() error {
31	xdgRuntimeDir := os.Getenv("XDG_RUNTIME_DIR")
32	if xdgRuntimeDir != "" {
33		dirs := strings.Split(xdgRuntimeDir, ":")
34		dir := filepath.Join(dirs[0], "buildkit")
35		if err := os.MkdirAll(dir, 0700); err != nil {
36			return err
37		}
38		return os.Chmod(dir, 0700|os.ModeSticky)
39	}
40	return nil
41}
42
43// UserRoot typically returns /home/$USER/.local/share/buildkit
44func UserRoot() string {
45	//  pam_systemd sets XDG_RUNTIME_DIR but not other dirs.
46	xdgDataHome := os.Getenv("XDG_DATA_HOME")
47	if xdgDataHome != "" {
48		dirs := strings.Split(xdgDataHome, ":")
49		return filepath.Join(dirs[0], "buildkit")
50	}
51	home := os.Getenv("HOME")
52	if home != "" {
53		return filepath.Join(home, ".local", "share", "buildkit")
54	}
55	return Root
56}
57
58// UserConfigDir returns dir for storing config. /home/$USER/.config/buildkit/
59func UserConfigDir() string {
60	xdgConfigHome := os.Getenv("XDG_CONFIG_HOME")
61	if xdgConfigHome != "" {
62		return filepath.Join(xdgConfigHome, "buildkit")
63	}
64	home := os.Getenv("HOME")
65	if home != "" {
66		return filepath.Join(home, ".config", "buildkit")
67	}
68	return ConfigDir
69}
70