diff options
Diffstat (limited to 'src/xrdb.c')
| -rw-r--r-- | src/xrdb.c | 101 |
1 files changed, 39 insertions, 62 deletions
diff --git a/src/xrdb.c b/src/xrdb.c index 9d056a607e4..59b0876ebf8 100644 --- a/src/xrdb.c +++ b/src/xrdb.c | |||
| @@ -41,7 +41,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 41 | #ifdef HAVE_PWD_H | 41 | #ifdef HAVE_PWD_H |
| 42 | #include <pwd.h> | 42 | #include <pwd.h> |
| 43 | #endif | 43 | #endif |
| 44 | #include <sys/stat.h> | ||
| 45 | 44 | ||
| 46 | #ifdef USE_MOTIF | 45 | #ifdef USE_MOTIF |
| 47 | /* For Vdouble_click_time. */ | 46 | /* For Vdouble_click_time. */ |
| @@ -50,7 +49,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 50 | 49 | ||
| 51 | char *x_get_string_resource (XrmDatabase rdb, const char *name, | 50 | char *x_get_string_resource (XrmDatabase rdb, const char *name, |
| 52 | const char *class); | 51 | const char *class); |
| 53 | static int file_p (const char *filename); | ||
| 54 | 52 | ||
| 55 | 53 | ||
| 56 | /* X file search path processing. */ | 54 | /* X file search path processing. */ |
| @@ -108,7 +106,7 @@ x_get_customization_string (XrmDatabase db, const char *name, | |||
| 108 | database associated with display. | 106 | database associated with display. |
| 109 | (This is x_customization_string.) | 107 | (This is x_customization_string.) |
| 110 | 108 | ||
| 111 | Return the expanded file name if it exists and is readable, and | 109 | Return the resource database if its file was read successfully, and |
| 112 | refers to %L only when the LANG environment variable is set, or | 110 | refers to %L only when the LANG environment variable is set, or |
| 113 | otherwise provided by X. | 111 | otherwise provided by X. |
| 114 | 112 | ||
| @@ -117,10 +115,11 @@ x_get_customization_string (XrmDatabase db, const char *name, | |||
| 117 | 115 | ||
| 118 | Return NULL otherwise. */ | 116 | Return NULL otherwise. */ |
| 119 | 117 | ||
| 120 | static char * | 118 | static XrmDatabase |
| 121 | magic_file_p (const char *string, ptrdiff_t string_len, const char *class, | 119 | magic_db (const char *string, ptrdiff_t string_len, const char *class, |
| 122 | const char *escaped_suffix) | 120 | const char *escaped_suffix) |
| 123 | { | 121 | { |
| 122 | XrmDatabase db; | ||
| 124 | char *lang = getenv ("LANG"); | 123 | char *lang = getenv ("LANG"); |
| 125 | 124 | ||
| 126 | ptrdiff_t path_size = 100; | 125 | ptrdiff_t path_size = 100; |
| @@ -217,14 +216,9 @@ magic_file_p (const char *string, ptrdiff_t string_len, const char *class, | |||
| 217 | } | 216 | } |
| 218 | 217 | ||
| 219 | path[path_len] = '\0'; | 218 | path[path_len] = '\0'; |
| 220 | 219 | db = XrmGetFileDatabase (path); | |
| 221 | if (! file_p (path)) | 220 | xfree (path); |
| 222 | { | 221 | return db; |
| 223 | xfree (path); | ||
| 224 | return NULL; | ||
| 225 | } | ||
| 226 | |||
| 227 | return path; | ||
| 228 | } | 222 | } |
| 229 | 223 | ||
| 230 | 224 | ||
| @@ -258,22 +252,11 @@ gethomedir (void) | |||
| 258 | } | 252 | } |
| 259 | 253 | ||
| 260 | 254 | ||
| 261 | static int | ||
| 262 | file_p (const char *filename) | ||
| 263 | { | ||
| 264 | struct stat status; | ||
| 265 | |||
| 266 | return (access (filename, 4) == 0 /* exists and is readable */ | ||
| 267 | && stat (filename, &status) == 0 /* get the status */ | ||
| 268 | && (S_ISDIR (status.st_mode)) == 0); /* not a directory */ | ||
| 269 | } | ||
| 270 | |||
| 271 | |||
| 272 | /* Find the first element of SEARCH_PATH which exists and is readable, | 255 | /* Find the first element of SEARCH_PATH which exists and is readable, |
| 273 | after expanding the %-escapes. Return 0 if we didn't find any, and | 256 | after expanding the %-escapes. Return 0 if we didn't find any, and |
| 274 | the path name of the one we found otherwise. */ | 257 | the path name of the one we found otherwise. */ |
| 275 | 258 | ||
| 276 | static char * | 259 | static XrmDatabase |
| 277 | search_magic_path (const char *search_path, const char *class, | 260 | search_magic_path (const char *search_path, const char *class, |
| 278 | const char *escaped_suffix) | 261 | const char *escaped_suffix) |
| 279 | { | 262 | { |
| @@ -286,18 +269,16 @@ search_magic_path (const char *search_path, const char *class, | |||
| 286 | 269 | ||
| 287 | if (p > s) | 270 | if (p > s) |
| 288 | { | 271 | { |
| 289 | char *path = magic_file_p (s, p - s, class, escaped_suffix); | 272 | XrmDatabase db = magic_db (s, p - s, class, escaped_suffix); |
| 290 | if (path) | 273 | if (db) |
| 291 | return path; | 274 | return db; |
| 292 | } | 275 | } |
| 293 | else if (*p == ':') | 276 | else if (*p == ':') |
| 294 | { | 277 | { |
| 295 | char *path; | 278 | static char const ns[] = "%N%S"; |
| 296 | 279 | XrmDatabase db = magic_db (ns, strlen (ns), class, escaped_suffix); | |
| 297 | s = "%N%S"; | 280 | if (db) |
| 298 | path = magic_file_p (s, strlen (s), class, escaped_suffix); | 281 | return db; |
| 299 | if (path) | ||
| 300 | return path; | ||
| 301 | } | 282 | } |
| 302 | 283 | ||
| 303 | if (*p == ':') | 284 | if (*p == ':') |
| @@ -312,21 +293,12 @@ search_magic_path (const char *search_path, const char *class, | |||
| 312 | static XrmDatabase | 293 | static XrmDatabase |
| 313 | get_system_app (const char *class) | 294 | get_system_app (const char *class) |
| 314 | { | 295 | { |
| 315 | XrmDatabase db = NULL; | ||
| 316 | const char *path; | 296 | const char *path; |
| 317 | char *p; | ||
| 318 | 297 | ||
| 319 | path = getenv ("XFILESEARCHPATH"); | 298 | path = getenv ("XFILESEARCHPATH"); |
| 320 | if (! path) path = PATH_X_DEFAULTS; | 299 | if (! path) path = PATH_X_DEFAULTS; |
| 321 | 300 | ||
| 322 | p = search_magic_path (path, class, 0); | 301 | return search_magic_path (path, class, 0); |
| 323 | if (p) | ||
| 324 | { | ||
| 325 | db = XrmGetFileDatabase (p); | ||
| 326 | xfree (p); | ||
| 327 | } | ||
| 328 | |||
| 329 | return db; | ||
| 330 | } | 302 | } |
| 331 | 303 | ||
| 332 | 304 | ||
| @@ -340,35 +312,40 @@ get_fallback (Display *display) | |||
| 340 | static XrmDatabase | 312 | static XrmDatabase |
| 341 | get_user_app (const char *class) | 313 | get_user_app (const char *class) |
| 342 | { | 314 | { |
| 315 | XrmDatabase db = 0; | ||
| 343 | const char *path; | 316 | const char *path; |
| 344 | char *file = 0; | ||
| 345 | char *free_it = 0; | ||
| 346 | 317 | ||
| 347 | /* Check for XUSERFILESEARCHPATH. It is a path of complete file | 318 | /* Check for XUSERFILESEARCHPATH. It is a path of complete file |
| 348 | names, not directories. */ | 319 | names, not directories. */ |
| 349 | if (((path = getenv ("XUSERFILESEARCHPATH")) | 320 | path = getenv ("XUSERFILESEARCHPATH"); |
| 350 | && (file = search_magic_path (path, class, 0))) | 321 | if (path) |
| 322 | db = search_magic_path (path, class, 0); | ||
| 351 | 323 | ||
| 324 | if (! db) | ||
| 325 | { | ||
| 352 | /* Check for APPLRESDIR; it is a path of directories. In each, | 326 | /* Check for APPLRESDIR; it is a path of directories. In each, |
| 353 | we have to search for LANG/CLASS and then CLASS. */ | 327 | we have to search for LANG/CLASS and then CLASS. */ |
| 354 | || ((path = getenv ("XAPPLRESDIR")) | 328 | path = getenv ("XAPPLRESDIR"); |
| 355 | && ((file = search_magic_path (path, class, "/%L/%N")) | 329 | if (path) |
| 356 | || (file = search_magic_path (path, class, "/%N")))) | 330 | { |
| 331 | db = search_magic_path (path, class, "/%L/%N"); | ||
| 332 | if (!db) | ||
| 333 | db = search_magic_path (path, class, "/%N"); | ||
| 334 | } | ||
| 335 | } | ||
| 357 | 336 | ||
| 337 | if (! db) | ||
| 338 | { | ||
| 358 | /* Check in the home directory. This is a bit of a hack; let's | 339 | /* Check in the home directory. This is a bit of a hack; let's |
| 359 | hope one's home directory doesn't contain any %-escapes. */ | 340 | hope one's home directory doesn't contain any %-escapes. */ |
| 360 | || (free_it = gethomedir (), | 341 | char *home = gethomedir (); |
| 361 | ((file = search_magic_path (free_it, class, "%L/%N")) | 342 | db = search_magic_path (home, class, "%L/%N"); |
| 362 | || (file = search_magic_path (free_it, class, "%N"))))) | 343 | if (! db) |
| 363 | { | 344 | db = search_magic_path (home, class, "%N"); |
| 364 | XrmDatabase db = XrmGetFileDatabase (file); | 345 | xfree (home); |
| 365 | xfree (file); | ||
| 366 | xfree (free_it); | ||
| 367 | return db; | ||
| 368 | } | 346 | } |
| 369 | 347 | ||
| 370 | xfree (free_it); | 348 | return db; |
| 371 | return NULL; | ||
| 372 | } | 349 | } |
| 373 | 350 | ||
| 374 | 351 | ||