This source file includes following definitions.
- mc_config_mkdir
- mc_config_init_one_config_path
- mc_config_init_config_paths
- mc_config_deinit_config_paths
- mc_config_get_data_path
- mc_config_get_cache_path
- mc_config_get_home_dir
- mc_config_get_path
- mc_config_get_full_path
- mc_config_get_full_vpath
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 #include <config.h>
27
28 #include <stdio.h>
29 #include <stdlib.h>
30
31 #include "lib/global.h"
32 #include "lib/fileloc.h"
33 #include "lib/vfs/vfs.h"
34 #include "lib/util.h"
35
36 #include "lib/mcconfig.h"
37
38
39
40
41
42
43
44
45
46
47
48 static gboolean xdg_vars_initialized = FALSE;
49 static char *mc_config_str = NULL;
50 static char *mc_cache_str = NULL;
51 static char *mc_data_str = NULL;
52
53 static gboolean config_dir_present = FALSE;
54
55 static const struct
56 {
57 char **basedir;
58 const char *filename;
59 } mc_config_files_reference[] = {
60
61
62 { &mc_config_str, MC_CONFIG_FILE },
63 { &mc_config_str, MC_FHL_INI_FILE },
64 { &mc_config_str, MC_HOTLIST_FILE },
65 { &mc_config_str, GLOBAL_KEYMAP_FILE },
66 { &mc_config_str, MC_USERMENU_FILE },
67 { &mc_config_str, EDIT_HOME_MENU },
68 { &mc_config_str, MC_PANELS_FILE },
69
70
71 { &mc_config_str, MC_EXT_FILE },
72 { &mc_config_str, MC_EXT_OLD_FILE },
73
74
75 { &mc_data_str, MC_SKINS_DIR },
76 { &mc_data_str, VFS_SHELL_PREFIX },
77 { &mc_data_str, MC_ASHRC_FILE },
78 { &mc_data_str, MC_BASHRC_FILE },
79 { &mc_data_str, MC_INPUTRC_FILE },
80 { &mc_data_str, MC_ZSHRC_FILE },
81 { &mc_data_str, MC_EXTFS_DIR },
82 { &mc_data_str, MC_HISTORY_FILE },
83 { &mc_data_str, MC_FILEPOS_FILE },
84 { &mc_data_str, EDIT_SYNTAX_FILE },
85 { &mc_data_str, EDIT_HOME_CLIP_FILE },
86 { &mc_data_str, MC_MACRO_FILE },
87
88
89 { &mc_cache_str, "mc.log" },
90 { &mc_cache_str, MC_TREESTORE_FILE },
91 { &mc_cache_str, EDIT_HOME_TEMP_FILE },
92 { &mc_cache_str, EDIT_HOME_BLOCK_FILE },
93
94 { NULL, NULL }
95
96 };
97
98
99
100
101
102 static void
103 mc_config_mkdir (const char *directory_name, GError **mcerror)
104 {
105 mc_return_if_error (mcerror);
106
107 if ((!g_file_test (directory_name, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) &&
108 (g_mkdir_with_parents (directory_name, 0700) != 0))
109 mc_propagate_error (mcerror, 0, _("Cannot create %s directory"), directory_name);
110 }
111
112
113
114 static char *
115 mc_config_init_one_config_path (const char *path_base, const char *subdir, GError **mcerror)
116 {
117 char *full_path;
118
119 mc_return_val_if_error (mcerror, FALSE);
120
121 full_path = g_build_filename (path_base, subdir, (char *) NULL);
122
123 if (g_file_test (full_path, G_FILE_TEST_EXISTS))
124 {
125 if (g_file_test (full_path, G_FILE_TEST_IS_DIR))
126 config_dir_present = TRUE;
127 else
128 {
129 fprintf (stderr, "%s %s\n", _("FATAL: not a directory:"), full_path);
130 exit (EXIT_FAILURE);
131 }
132 }
133
134 mc_config_mkdir (full_path, mcerror);
135 if (mcerror != NULL && *mcerror != NULL)
136 MC_PTR_FREE (full_path);
137
138 return full_path;
139 }
140
141
142
143
144
145 void
146 mc_config_init_config_paths (GError **mcerror)
147 {
148 const char *profile_root;
149 char *dir;
150
151 mc_return_if_error (mcerror);
152
153 if (xdg_vars_initialized)
154 return;
155
156 profile_root = mc_get_profile_root ();
157
158 if (strcmp (profile_root, mc_config_get_home_dir ()) != 0)
159 {
160
161
162
163
164
165
166
167 dir = g_build_filename (profile_root, ".config", (char *) NULL);
168 mc_config_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, mcerror);
169 g_free (dir);
170
171 dir = g_build_filename (profile_root, ".cache", (char *) NULL);
172 mc_cache_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, mcerror);
173 g_free (dir);
174
175 dir = g_build_filename (profile_root, ".local", "share", (char *) NULL);
176 mc_data_str = mc_config_init_one_config_path (dir, MC_USERCONF_DIR, mcerror);
177 g_free (dir);
178 }
179 else
180 {
181 mc_config_str =
182 mc_config_init_one_config_path (g_get_user_config_dir (), MC_USERCONF_DIR, mcerror);
183 mc_cache_str =
184 mc_config_init_one_config_path (g_get_user_cache_dir (), MC_USERCONF_DIR, mcerror);
185 mc_data_str =
186 mc_config_init_one_config_path (g_get_user_data_dir (), MC_USERCONF_DIR, mcerror);
187 }
188
189 xdg_vars_initialized = TRUE;
190 }
191
192
193
194 void
195 mc_config_deinit_config_paths (void)
196 {
197 if (!xdg_vars_initialized)
198 return;
199
200 g_free (mc_config_str);
201 g_free (mc_cache_str);
202 g_free (mc_data_str);
203
204 g_free (mc_global.share_data_dir);
205 g_free (mc_global.sysconfig_dir);
206
207 xdg_vars_initialized = FALSE;
208 }
209
210
211
212 const char *
213 mc_config_get_data_path (void)
214 {
215 if (!xdg_vars_initialized)
216 mc_config_init_config_paths (NULL);
217
218 return (const char *) mc_data_str;
219 }
220
221
222
223 const char *
224 mc_config_get_cache_path (void)
225 {
226 if (!xdg_vars_initialized)
227 mc_config_init_config_paths (NULL);
228
229 return (const char *) mc_cache_str;
230 }
231
232
233
234 const char *
235 mc_config_get_home_dir (void)
236 {
237 static const char *homedir = NULL;
238
239 if (homedir == NULL)
240 {
241
242
243
244
245 homedir = g_getenv ("HOME");
246 if (homedir == NULL || *homedir == '\0')
247 homedir = g_get_home_dir ();
248 }
249
250 return homedir;
251 }
252
253
254
255 const char *
256 mc_config_get_path (void)
257 {
258 if (!xdg_vars_initialized)
259 mc_config_init_config_paths (NULL);
260
261 return (const char *) mc_config_str;
262 }
263
264
265
266
267
268
269
270
271
272 char *
273 mc_config_get_full_path (const char *config_name)
274 {
275 size_t rule_index;
276
277 if (config_name == NULL)
278 return NULL;
279
280 if (!xdg_vars_initialized)
281 mc_config_init_config_paths (NULL);
282
283 for (rule_index = 0; mc_config_files_reference[rule_index].filename != NULL; rule_index++)
284 if (strcmp (config_name, mc_config_files_reference[rule_index].filename) == 0)
285 return g_build_filename (*mc_config_files_reference[rule_index].basedir,
286 mc_config_files_reference[rule_index].filename, (char *) NULL);
287
288 return NULL;
289 }
290
291
292
293
294
295
296
297
298
299 vfs_path_t *
300 mc_config_get_full_vpath (const char *config_name)
301 {
302 vfs_path_t *ret_vpath;
303 char *str_path;
304
305 str_path = mc_config_get_full_path (config_name);
306
307 ret_vpath = vfs_path_from_str (str_path);
308 g_free (str_path);
309
310 return ret_vpath;
311 }
312
313