diff options
author | Yang Tse <yangsita@gmail.com> | 2011-10-06 17:39:00 +0200 |
---|---|---|
committer | Yang Tse <yangsita@gmail.com> | 2011-10-06 17:39:00 +0200 |
commit | f7bfdbabf2d5398f4c266eabb0992a04af661f22 (patch) | |
tree | 694a1f91f1aeffaf7aea0f29a05179079af7d700 /src/tool_homedir.c | |
parent | 7afccf7a1ebb211905de6abd415fce416058a126 (diff) | |
download | curl-f7bfdbabf2d5398f4c266eabb0992a04af661f22.tar.gz |
curl tool: reviewed code moved to tool_*.[ch] files
Diffstat (limited to 'src/tool_homedir.c')
-rw-r--r-- | src/tool_homedir.c | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/tool_homedir.c b/src/tool_homedir.c new file mode 100644 index 000000000..95d25c74f --- /dev/null +++ b/src/tool_homedir.c @@ -0,0 +1,112 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at http://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ***************************************************************************/ +#include "setup.h" + +#ifdef HAVE_PWD_H +# include <pwd.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif +#ifdef __VMS +# include <unixlib.h> +#endif + +#include "tool_homedir.h" + +#include "memdebug.h" /* keep this as LAST include */ + +static char *GetEnv(const char *variable, char do_expand) +{ + char *env = NULL; +#ifdef WIN32 + char buf1[1024], buf2[1024]; + DWORD rc; + + /* Don't use getenv(); it doesn't find variable added after program was + * started. Don't accept truncated results (i.e. rc >= sizeof(buf1)). */ + + rc = GetEnvironmentVariable(variable, buf1, sizeof(buf1)); + if(rc > 0 && rc < sizeof(buf1)) { + env = buf1; + variable = buf1; + } + if(do_expand && strchr(variable,'%')) { + /* buf2 == variable if not expanded */ + rc = ExpandEnvironmentStrings (variable, buf2, sizeof(buf2)); + if(rc > 0 && rc < sizeof(buf2) && + !strchr(buf2,'%')) /* no vars still unexpanded */ + env = buf2; + } +#else + (void)do_expand; +#ifdef __VMS + env = getenv(variable); + if(env && strcmp("HOME",variable) == 0) { + env = decc_translate_vms(env); + } +#else + /* no length control */ + env = getenv(variable); +#endif +#endif + return (env && env[0]) ? strdup(env) : NULL; +} + +/* return the home directory of the current user as an allocated string */ +char *homedir(void) +{ + char *home; + + home = GetEnv("CURL_HOME", FALSE); + if(home) + return home; + + home = GetEnv("HOME", FALSE); + if(home) + return home; + +#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) + { + struct passwd *pw = getpwuid(geteuid()); + + if(pw) { +#ifdef __VMS + home = decc_translate_vms(pw->pw_dir); +#else + home = pw->pw_dir; +#endif + if(home && home[0]) + home = strdup(home); + else + home = NULL; + } + } +#endif /* PWD-stuff */ +#ifdef WIN32 + home = GetEnv("APPDATA", TRUE); + if(!home) + home = GetEnv("%USERPROFILE%\\Application Data", TRUE); /* Normally only + on Win-2K/XP */ +#endif /* WIN32 */ + return home; +} |