- Timestamp:
- Jul 16, 2011, 12:28:10 AM (14 years ago)
- Branches:
- master, release-1.10, release-1.8, release-1.9
- Children:
- f5f6ec0
- Parents:
- 99ac28a
- git-author:
- David Benjamin <davidben@mit.edu> (07/10/11 19:11:46)
- git-committer:
- David Benjamin <davidben@mit.edu> (07/16/11 00:28:10)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
util.c
r396505be r8219374 32 32 } 33 33 34 CALLER_OWN char *owl_util_homedir_for_user(const char *name) 35 { 36 int err; 37 struct passwd pw_buf; 38 struct passwd *pw; 39 40 char *pw_strbuf, *ret; 41 long pw_strbuf_len = sysconf(_SC_GETPW_R_SIZE_MAX); 42 if (pw_strbuf_len < 0) { 43 /* If we really hate ourselves, we can be fancy and loop until we stop 44 * getting ERANGE. For now just pick a random number. */ 45 owl_function_error("owl_util_homedir_for_user: Could not get _SC_GETPW_R_SIZE_MAX"); 46 pw_strbuf_len = 16384; 47 } 48 pw_strbuf = g_new0(char, pw_strbuf_len); 49 err = getpwnam_r(name, &pw_buf, pw_strbuf, pw_strbuf_len, &pw); 50 if (err) { 51 owl_function_error("getpwuid_r: %s", strerror(err)); 52 /* Fall through; pw will be NULL. */ 53 } 54 ret = pw ? g_strdup(pw->pw_dir) : NULL; 55 g_free(pw_strbuf); 56 return ret; 57 } 58 34 59 /* Return a "nice" version of the path. Tilde expansion is done, and 35 60 * duplicate slashes are removed. Caller must free the return. … … 55 80 /* Someone else's home directory. */ 56 81 char *user = g_strndup(in + 1, end - (in + 1)); 57 struct passwd *pw = getpwnam(user); 58 g_free(user); 59 if (pw) { 60 out = g_strconcat(pw->pw_dir, end, NULL); 82 char *home = owl_util_homedir_for_user(user); 83 if (home) { 84 out = g_strconcat(home, end, NULL); 61 85 } else { 62 86 out = g_strdup(in); 63 87 } 88 g_free(home); 89 g_free(user); 64 90 } 65 91 } else {
Note: See TracChangeset
for help on using the changeset viewer.