diff options
Diffstat (limited to 'src/xrdb.c')
| -rw-r--r-- | src/xrdb.c | 54 |
1 files changed, 11 insertions, 43 deletions
diff --git a/src/xrdb.c b/src/xrdb.c index 4abf1ad84ed..87c2faf6598 100644 --- a/src/xrdb.c +++ b/src/xrdb.c | |||
| @@ -202,35 +202,6 @@ magic_db (const char *string, ptrdiff_t string_len, const char *class, | |||
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | 204 | ||
| 205 | static char * | ||
| 206 | gethomedir (void) | ||
| 207 | { | ||
| 208 | struct passwd *pw; | ||
| 209 | char *ptr; | ||
| 210 | char *copy; | ||
| 211 | |||
| 212 | if ((ptr = getenv ("HOME")) == NULL) | ||
| 213 | { | ||
| 214 | if ((ptr = getenv ("LOGNAME")) != NULL | ||
| 215 | || (ptr = getenv ("USER")) != NULL) | ||
| 216 | pw = getpwnam (ptr); | ||
| 217 | else | ||
| 218 | pw = getpwuid (getuid ()); | ||
| 219 | |||
| 220 | if (pw) | ||
| 221 | ptr = pw->pw_dir; | ||
| 222 | } | ||
| 223 | |||
| 224 | if (ptr == NULL) | ||
| 225 | return xstrdup ("/"); | ||
| 226 | |||
| 227 | ptrdiff_t len = strlen (ptr); | ||
| 228 | copy = xmalloc (len + 2); | ||
| 229 | strcpy (copy + len, "/"); | ||
| 230 | return memcpy (copy, ptr, len); | ||
| 231 | } | ||
| 232 | |||
| 233 | |||
| 234 | /* Find the first element of SEARCH_PATH which exists and is readable, | 205 | /* Find the first element of SEARCH_PATH which exists and is readable, |
| 235 | after expanding the %-escapes. Return 0 if we didn't find any, and | 206 | after expanding the %-escapes. Return 0 if we didn't find any, and |
| 236 | the path name of the one we found otherwise. */ | 207 | the path name of the one we found otherwise. */ |
| @@ -316,12 +287,11 @@ get_user_app (const char *class) | |||
| 316 | if (! db) | 287 | if (! db) |
| 317 | { | 288 | { |
| 318 | /* Check in the home directory. This is a bit of a hack; let's | 289 | /* Check in the home directory. This is a bit of a hack; let's |
| 319 | hope one's home directory doesn't contain any %-escapes. */ | 290 | hope one's home directory doesn't contain ':' or '%'. */ |
| 320 | char *home = gethomedir (); | 291 | char const *home = get_homedir (); |
| 321 | db = search_magic_path (home, class, "%L/%N"); | 292 | db = search_magic_path (home, class, "%L/%N"); |
| 322 | if (! db) | 293 | if (! db) |
| 323 | db = search_magic_path (home, class, "%N"); | 294 | db = search_magic_path (home, class, "%N"); |
| 324 | xfree (home); | ||
| 325 | } | 295 | } |
| 326 | 296 | ||
| 327 | return db; | 297 | return db; |
| @@ -346,10 +316,9 @@ get_user_db (Display *display) | |||
| 346 | else | 316 | else |
| 347 | { | 317 | { |
| 348 | /* Use ~/.Xdefaults. */ | 318 | /* Use ~/.Xdefaults. */ |
| 349 | char *home = gethomedir (); | 319 | char const *home = get_homedir (); |
| 350 | ptrdiff_t homelen = strlen (home); | 320 | char *filename = xmalloc (strlen (home) + 1 + sizeof xdefaults); |
| 351 | char *filename = xrealloc (home, homelen + sizeof xdefaults); | 321 | splice_dir_file (filename, home, xdefaults); |
| 352 | strcpy (filename + homelen, xdefaults); | ||
| 353 | db = XrmGetFileDatabase (filename); | 322 | db = XrmGetFileDatabase (filename); |
| 354 | xfree (filename); | 323 | xfree (filename); |
| 355 | } | 324 | } |
| @@ -380,13 +349,12 @@ get_environ_db (void) | |||
| 380 | if (STRINGP (system_name)) | 349 | if (STRINGP (system_name)) |
| 381 | { | 350 | { |
| 382 | /* Use ~/.Xdefaults-HOSTNAME. */ | 351 | /* Use ~/.Xdefaults-HOSTNAME. */ |
| 383 | char *home = gethomedir (); | 352 | char const *home = get_homedir (); |
| 384 | ptrdiff_t homelen = strlen (home); | 353 | p = filename = xmalloc (strlen (home) + 1 + sizeof xdefaults |
| 385 | ptrdiff_t filenamesize = (homelen + sizeof xdefaults | 354 | + 1 + SBYTES (system_name)); |
| 386 | + 1 + SBYTES (system_name)); | 355 | char *e = splice_dir_file (p, home, xdefaults); |
| 387 | p = filename = xrealloc (home, filenamesize); | 356 | *e++ = '/'; |
| 388 | lispstpcpy (stpcpy (stpcpy (filename + homelen, xdefaults), "-"), | 357 | lispstpcpy (e, system_name); |
| 389 | system_name); | ||
| 390 | } | 358 | } |
| 391 | } | 359 | } |
| 392 | 360 | ||