diff options
| -rw-r--r-- | CHANGES | 18 | ||||
| -rw-r--r-- | docs/libcurl/curl_easy_setopt.3 | 7 | ||||
| -rw-r--r-- | include/curl/curl.h | 6 | ||||
| -rw-r--r-- | lib/netrc.c | 93 | ||||
| -rw-r--r-- | lib/netrc.h | 3 | ||||
| -rw-r--r-- | lib/url.c | 9 | ||||
| -rw-r--r-- | lib/urldata.h | 2 | 
7 files changed, 87 insertions, 51 deletions
@@ -7,6 +7,24 @@                                    Changelog +Daniel (11 November) +- Added CURLOPT_NETRC_FILE. Use this to tell libcurl which file to use instead +  of trying to find a .netrc in the current user's home directory. The +  existing .netrc file finder is somewhat naive and is far from perfect on +  several platforms that aren't unix-style. If this option isn't set when +  CURLOPT_NETRC is set, the previous approach will still be used. + +  The current .netrc check code now also support longer than 256 bytes path +  names. + +Daniel (10 November) +- Kang-Jin Lee pointed out that the generated ca-bundle.h file shouldn't be +  written in the source dir if a different build dir is used. + +- After Sébastien Willemijns' bug report, we now check the separators properly +  in the 229-reply servers respond on a EPSV command and bail out better if +  the reply string is not RFC2428-compliant. +  Daniel (7 November)  - Based on Gisle Vanem's patch, I made curl try harder to get the home    directory of the current user, in order to find the default .curlrc file. diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3 index ab104cda3..9096fdf30 100644 --- a/docs/libcurl/curl_easy_setopt.3 +++ b/docs/libcurl/curl_easy_setopt.3 @@ -1,7 +1,7 @@  .\" nroff -man [file]  .\" $Id$  .\" -.TH curl_easy_setopt 3 "7 Nov 2003" "libcurl 7.10.8" "libcurl Manual" +.TH curl_easy_setopt 3 "11 Nov 2003" "libcurl 7.10.9" "libcurl Manual"  .SH NAME  curl_easy_setopt - set options for a curl easy handle  .SH SYNOPSIS @@ -274,6 +274,11 @@ Only machine name, user name and password are taken into account  \fBNote:\fP libcurl does not verify that the file has the correct properties  set (as the standard Unix ftp client does). It should only be readable by  user. +.IP CURLOPT_NETRC_FILE +Pass a char * as parameter, pointing to a zero terminated string containing +the full path name to the file you want libcurl to use as .netrc file. If this +option is omitted, and CURLOPT_NETRC is set, libcurl will attempt to find the +a .netrc file in the current user's home directory.  .IP CURLOPT_USERPWD  Pass a char * as parameter, which should be [user name]:[password] to use for  the connection. Use \fICURLOPT_HTTPAUTH\fP to decide authentication method. diff --git a/include/curl/curl.h b/include/curl/curl.h index 5884c292e..c3c41b4d2 100644 --- a/include/curl/curl.h +++ b/include/curl/curl.h @@ -693,6 +693,12 @@ typedef enum {       an HTTP or FTP server. */    CINIT(MAXFILESIZE, LONG, 114), +  /* Set this option to the file name of your .netrc file you want libcurl +     to parse (using the CURLOPT_NETRC option). If not set, libcurl will do +     a poor attempt to find the user's home directory and check for a .netrc +     file in there. */ +  CINIT(NETRC_FILE, OBJECTPOINT, 115), +    CURLOPT_LASTENTRY /* the last unused */  } CURLoption; diff --git a/lib/netrc.c b/lib/netrc.c index ed5d70252..c6443608e 100644 --- a/lib/netrc.c +++ b/lib/netrc.c @@ -45,6 +45,9 @@  #include "strequal.h"  #include "strtok.h" +#define _MPRINTF_REPLACE /* use our functions only */ +#include <curl/mprintf.h> +  /* The last #include file should be: */  #ifdef CURLDEBUG  #include "memdebug.h" @@ -71,54 +74,24 @@ enum {  #define LOGINSIZE 64  #define PASSWORDSIZE 64 +/* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */  int Curl_parsenetrc(char *host,                      char *login, -                    char *password) +                    char *password, +                    char *netrcfile)  {    FILE *file; -  char netrcbuffer[256];    int retcode=1; -    int specific_login = (login[0] != 0); -      char *home = NULL;  +  bool home_alloc = FALSE; +  bool netrc_alloc = FALSE;    int state=NOTHING;    char state_login=0;      /* Found a login keyword */    char state_password=0;   /* Found a password keyword */    char state_our_login=0;  /* With specific_login, found *our* login name */ -#define NETRC DOT_CHAR "netrc" - -#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) -  struct passwd *pw; -  pw= getpwuid(geteuid()); -  if (pw) { -#ifdef	VMS -    home = decc$translate_vms(pw->pw_dir); -#else -    home = pw->pw_dir; -#endif -  } -#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))) { -    if(NULL==pw) -      free(home); -    return -1; -  } - -  sprintf(netrcbuffer, "%s%s%s", home, DIR_CHAR, NETRC); -  #ifdef CURLDEBUG    {      /* This is a hack to allow testing. @@ -127,27 +100,49 @@ int Curl_parsenetrc(char *host,      char *override = curl_getenv("CURL_DEBUG_NETRC"); -    if (override != NULL) { +    if (override) {        printf("NETRC: overridden .netrc file: %s\n", home); - -      if (strlen(override)+1 > sizeof(netrcbuffer)) { -        free(override); -        if(NULL==pw) -          free(home); - -        return -1; -      } -      strcpy(netrcbuffer, override); -      free(override); +      netrcfile = override; +      netrc_alloc = TRUE;      }    }  #endif /* CURLDEBUG */ +  if(!netrcfile) { +#define NETRC DOT_CHAR "netrc" +#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID) +    struct passwd *pw; +    pw= getpwuid(geteuid()); +    if (pw) { +#ifdef	VMS +      home = decc$translate_vms(pw->pw_dir); +#else +      home = pw->pw_dir; +#endif +    } +#endif +   +    if(NULL == pw) { +      home = curl_getenv("HOME"); /* portable environment reader */ +      if(!home) +        return -1; +      home_alloc = TRUE; +    } + +    netrcfile = curl_maprintf("%s%s%s", home, DIR_CHAR, NETRC); +    if(!netrcfile) { +      if(home_alloc) +        free(home); +      return -1; +    } +    netrc_alloc = TRUE; +  } -  file = fopen(netrcbuffer, "r"); +  file = fopen(netrcfile, "r");    if(file) {      char *tok;      char *tok_buf;      bool done=FALSE; +    char netrcbuffer[256];      while(!done && fgets(netrcbuffer, sizeof(netrcbuffer), file)) {        tok=strtok_r(netrcbuffer, " \t\n", &tok_buf); @@ -223,8 +218,10 @@ int Curl_parsenetrc(char *host,      fclose(file);    } -  if(NULL==pw) +  if(home_alloc)      free(home); +  if(netrc_alloc) +    free(netrcfile);    return retcode;  } diff --git a/lib/netrc.h b/lib/netrc.h index 8b5bdc1a5..ef066b4c3 100644 --- a/lib/netrc.h +++ b/lib/netrc.h @@ -24,7 +24,8 @@   ***************************************************************************/  int Curl_parsenetrc(char *host,                      char *login, -                    char *password); +                    char *password, +                    char *filename);    /* Assume: password[0]=0, host[0] != 0.     * If login[0] = 0, search for login and password within a machine section     * in the netrc. @@ -507,6 +507,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)       */      data->set.use_netrc = va_arg(param, long);      break; +  case CURLOPT_NETRC_FILE: +    /* +     * Use this file instead of the $HOME/.netrc file +     */ +    data->set.netrc_file = va_arg(param, char *); +    break;    case CURLOPT_FOLLOWLOCATION:      /*       * Follow Location: header hints on a HTTP-server. @@ -2758,7 +2764,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,    if (data->set.use_netrc != CURL_NETRC_IGNORED) {      if(Curl_parsenetrc(conn->hostname, -                       user, passwd)) { +                       user, passwd, +                       data->set.netrc_file)) {        infof(data, "Couldn't find host %s in the .netrc file, using defaults",              conn->hostname);      } diff --git a/lib/urldata.h b/lib/urldata.h index d26cab6d9..aab332e80 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -854,6 +854,8 @@ struct UserDefined {    bool upload;    enum CURL_NETRC_OPTION         use_netrc;        /* defined in include/curl.h */ +  char *netrc_file;      /* if not NULL, use this instead of trying to find +                            $HOME/.netrc */    bool verbose;    bool krb4;             /* kerberos4 connection requested */    bool reuse_forbid;     /* forbidden to be reused, close after use */  | 
