utils: pass a const string to parsePath()

Remove the slash hack, allocate memory for the user name.
This commit is contained in:
Max Kellermann 2011-09-09 22:17:35 +02:00
parent cceaec1d74
commit 61fc01e79e
2 changed files with 14 additions and 15 deletions

View File

@ -41,7 +41,8 @@
#include <windows.h> #include <windows.h>
#endif #endif
char *parsePath(char *path) char *
parsePath(const char *path)
{ {
#ifndef WIN32 #ifndef WIN32
if (!g_path_is_absolute(path) && path[0] != '~') { if (!g_path_is_absolute(path) && path[0] != '~') {
@ -71,27 +72,24 @@ char *parsePath(char *path)
++path; ++path;
} else { } else {
bool foundSlash = false; ++path;
struct passwd *passwd;
char *c;
for (c = path + 1; *c != '\0' && *c != '/'; c++); const char *slash = strchr(path, '/');
if (*c == '/') { char *user = slash != NULL
foundSlash = true; ? g_strndup(path, slash - path)
*c = '\0'; : g_strdup(path);
}
passwd = getpwnam(path + 1); struct passwd *passwd = getpwnam(user);
if (!passwd) { if (!passwd) {
g_warning("user \"%s\" not found", path + 1); g_warning("user \"%s\" not found", user);
g_free(user);
return NULL; return NULL;
} }
if (foundSlash) g_free(user);
*c = '/';
home = passwd->pw_dir; home = passwd->pw_dir;
path = c; path = slash;
} }
return g_strconcat(home, path, NULL); return g_strconcat(home, path, NULL);

View File

@ -31,6 +31,7 @@
} while (0) } while (0)
#endif /* !assert_static */ #endif /* !assert_static */
char *parsePath(char *path); char *
parsePath(const char *path);
#endif #endif