From 8be602cdfdfa117e1f771f1a7cdf995ea4ab989b Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 7 Nov 2003 17:17:15 +0000 Subject: [PATCH] Based on Gisle Vanem's $HOME patch, we now attempt to find the home dir in a slightly better way for more platforms. The $HOME is only used for .curlrc atm, but the possible upcoming change of .netrc treatment may also need the home dir. --- src/Makefile.am | 2 +- src/config.h.in | 6 +++ src/homedir.c | 114 ++++++++++++++++++++++++++++++++++++++++++++++++ src/homedir.h | 28 ++++++++++++ src/main.c | 6 +-- 5 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 src/homedir.c create mode 100644 src/homedir.h diff --git a/src/Makefile.am b/src/Makefile.am index da9c51b2c..cf60ee54f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -25,7 +25,7 @@ endif curl_SOURCES = main.c hugehelp.c urlglob.c writeout.c setup.h \ config-win32.h config-mac.h config-vms.h config-riscos.h \ urlglob.h version.h writeout.h writeenv.c writeenv.h \ - getpass.c getpass.h + getpass.c getpass.h homedir.c homedir.h curl_LDADD = ../lib/libcurl.la curl_DEPENDENCIES = ../lib/libcurl.la diff --git a/src/config.h.in b/src/config.h.in index 7f6efc27e..0de6dceea 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -67,3 +67,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_TERMIO_H + +/* Define to 1 if you have the `getpwuid' function. */ +#undef HAVE_GETPWUID + +/* Define to 1 if you have the `geteuid' function. */ +#undef HAVE_GETEUID diff --git a/src/homedir.c b/src/homedir.c new file mode 100644 index 000000000..507dd58f1 --- /dev/null +++ b/src/homedir.c @@ -0,0 +1,114 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2003, Daniel Stenberg, , 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. + * + * $Id$ + ***************************************************************************/ + +#include "setup.h" + +#include +#include +#include + +#ifdef WIN32 +#include +#endif +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef VMS +#include +#endif + +#ifdef CURLDEBUG +#include "../lib/memdebug.h" +#endif + +static +char *GetEnv(const char *variable, bool 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 = 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); + } + } +#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; +} diff --git a/src/homedir.h b/src/homedir.h new file mode 100644 index 000000000..8bad31878 --- /dev/null +++ b/src/homedir.h @@ -0,0 +1,28 @@ +#ifndef __HOMEDIR_H +#define __HOMEDIR_H +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2003, Daniel Stenberg, , 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. + * + * $Id$ + ***************************************************************************/ + +char *homedir(void); + +#endif diff --git a/src/main.c b/src/main.c index e5a0caf09..b436ef20b 100644 --- a/src/main.c +++ b/src/main.c @@ -41,6 +41,7 @@ #include "urlglob.h" #include "writeout.h" #include "getpass.h" +#include "homedir.h" #ifdef USE_ENVIRONMENT #include "writeenv.h" #endif @@ -2054,11 +2055,10 @@ static int parseconfig(const char *filename, #define CURLRC DOT_CHAR "curlrc" - filename = CURLRC; /* sensible default */ - home = curl_getenv("HOME"); /* portable environment reader */ + filename = CURLRC; /* sensible default */ + home = homedir(); /* portable homedir finder */ if(home) { if(strlen(home)<(sizeof(filebuffer)-strlen(CURLRC))) { - snprintf(filebuffer, sizeof(filebuffer), "%s%s%s", home, DIR_CHAR, CURLRC);