diff options
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/config.h.in | 6 | ||||
-rw-r--r-- | src/homedir.c | 114 | ||||
-rw-r--r-- | src/homedir.h | 28 | ||||
-rw-r--r-- | src/main.c | 6 |
5 files changed, 152 insertions, 4 deletions
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 <termio.h> 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, <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. + * + * $Id$ + ***************************************************************************/ + +#include "setup.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifdef WIN32 +#include <windows.h> +#endif +#ifdef HAVE_PWD_H +#include <pwd.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef VMS +#include <unixlib.h> +#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, <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. + * + * $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); |