1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
diff --git a/src/Intrinsic.c b/src/Intrinsic.c
--- a/src/Intrinsic.c
+++ b/src/Intrinsic.c
@@ -1345,21 +1345,99 @@ FillInLangSubs(Substitution subs, XtPerDisplay pd)
}
/*
- * default path used if environment variable XFILESEARCHPATH
- * is not defined. Also substitued for %D.
- * The exact value should be documented in the implementation
- * notes for any Xt implementation.
+ Return the default search path for the function
+ XtResolvePathname to use if XFILESEARCHPATH is
+ not defined.
+
+ It returns the combination the set of values which are the 6 "stems" below,
+ prepended with "/run/current-system/profile", and $GUIX_PROFILE and
+ "$HOME/.guix-profile"
+
+ These values provide the default paths where Guix/GuixSD can expect
+ to find resources for installed packages.
*/
static const char *
-implementation_default_path(void)
+guix_default_path(void)
{
-#if defined(WIN32)
- static char xfilesearchpath[] = "";
+ static const char *search_path_default_stem[] = {
+ "/lib/X11/%L/%T/%N%C%S",
+ "/lib/X11/%l/%T/%N%C%S",
+ "/lib/X11/%T/%N%C%S",
+ "/lib/X11/%L/%T/%N%S",
+ "/lib/X11/%l/%T/%N%S",
+ "/lib/X11/%T/%N%S"
+ };
+
+#define SIZEOF_STEMS (strlen (search_path_default_stem[0]) \
+ + strlen (search_path_default_stem[1]) \
+ + strlen (search_path_default_stem[2]) \
+ + strlen (search_path_default_stem[3]) \
+ + strlen (search_path_default_stem[4]) \
+ + strlen (search_path_default_stem[5]))
+
+
+ int i;
+ const char *current_profile = "/run/current-system/profile";
+ char *home = getenv ("HOME");
+ char *guix_profile = getenv ("GUIX_PROFILE");
+
+ size_t bytesAllocd = SIZEOF_STEMS + 1;
+
+ /* This function is evaluated multiple times and the calling
+ code assumes that it is idempotent. So we must not allow
+ (say) a changed environment variable to cause it to return
+ something different. */
+ static char *path = NULL;
+ if (path)
+ return path;
+
+ bytesAllocd += 6 * (1 + strlen (current_profile));
+
+ if (guix_profile != NULL)
+ {
+ bytesAllocd += SIZEOF_STEMS;
+ bytesAllocd += 6 * (1 + strlen (guix_profile));
+ }
- return xfilesearchpath;
-#else
- return XFILESEARCHPATHDEFAULT;
-#endif
+ if (home != NULL)
+ {
+ bytesAllocd += SIZEOF_STEMS;
+ bytesAllocd += 6 * (1 + strlen(home) + strlen ("/.guix-profile"));
+ }
+
+ path = XtMalloc(bytesAllocd);
+ if (path == NULL) _XtAllocError(NULL);
+
+ memset (path, 0, bytesAllocd);
+
+ for (i = 0 ; i < 6 ; ++i)
+ {
+ strcat (path, current_profile);
+ strcat (path, search_path_default_stem[i]);
+ strcat (path, ":");
+ }
+
+ if (guix_profile != NULL)
+ for (i = 0 ; i < 6 ; ++i)
+ {
+ strcat (path, guix_profile);
+ strcat (path, search_path_default_stem[i]);
+ strcat (path, ":");
+ }
+
+ if (home != NULL)
+ for (i = 0 ; i < 6 ; ++i)
+ {
+ strcat (path, home);
+ strcat (path, "/.guix-profile");
+ strcat (path, search_path_default_stem[i]);
+ strcat (path, ":");
+ }
+
+ /* Remove final : */
+ path[strlen(path) - 1] = '\0';
+
+ return path;
}
@@ -1388,7 +1466,7 @@ XtResolvePathname(Display *dpy,
{
XtPerDisplay pd;
static const char *defaultPath = NULL;
- const char *impl_default = implementation_default_path();
+ const char *impl_default = guix_default_path();
int idef_len = (int) strlen(impl_default);
char *massagedPath;
int bytesAllocd, bytesLeft;
|