diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/netrc.c | 42 | 
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/netrc.c b/lib/netrc.c index 598f4515d..f8f16058c 100644 --- a/lib/netrc.c +++ b/lib/netrc.c @@ -27,6 +27,17 @@  #include <stdlib.h>  #include <string.h> +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif +#ifdef HAVE_PWD_H +#include <pwd.h> +#endif + +  #include <curl/curl.h>  #include "strequal.h" @@ -60,7 +71,7 @@ int Curl_parsenetrc(char *host,    char netrcbuffer[256];    int retcode=1; -  char *home = curl_getenv("HOME"); /* portable environment reader */ +  char *home = NULL;     int state=NOTHING;    char state_login=0; @@ -68,16 +79,29 @@ int Curl_parsenetrc(char *host,  #define NETRC DOT_CHAR "netrc" -  if(!home) -    return -1; - -  if(strlen(home)>(sizeof(netrcbuffer)-strlen(NETRC))) { -    free(home); -    return -1; +#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) +  struct passwd *pw; +  pw= getpwuid(geteuid()); +  if (pw) +    strncat(netrcbuffer, pw->pw_dir, 255); +#else +  void *pw=NULL; +#endif +   +  if(NULL == pw) { +    home = curl_getenv("HOME"); /* portable environment reader */ +    if(!home) { +      return -1; +    } + +    if(strlen(home)>(sizeof(netrcbuffer)-strlen(NETRC))) { +      free(home); +      return -1; +    } + +    sprintf(netrcbuffer, "%s%s%s", home, DIR_CHAR, NETRC);    } -  sprintf(netrcbuffer, "%s%s%s", home, DIR_CHAR, NETRC); -    file = fopen(netrcbuffer, "r");    if(file) {      char *tok;  | 
