]> sjero.net Git - wget/blobdiff - src/netrc.c
[svn] Merge of fix for bugs 20341 and 20410.
[wget] / src / netrc.c
index 28e9ec42d811f3f1d78fabcecf089775eb9fefeb..ba9fc3099d7d9d93564bcc0bab4937e954f4ef50 100644 (file)
@@ -5,7 +5,7 @@ This file is part of GNU Wget.
 
 GNU Wget is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 
 GNU Wget is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+the Free Software Foundation; either version 3 of the License, or
 (at your option) any later version.
 
 GNU Wget is distributed in the hope that it will be useful,
 (at your option) any later version.
 
 GNU Wget is distributed in the hope that it will be useful,
@@ -14,8 +14,17 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with Wget; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+along with Wget.  If not, see <http://www.gnu.org/licenses/>.
+
+In addition, as a special exception, the Free Software Foundation
+gives permission to link the code of its release of Wget with the
+OpenSSL project's "OpenSSL" library (or with modified versions of it
+that use the same license as the "OpenSSL" library), and distribute
+the linked executables.  You must obey the GNU General Public License
+in all respects for all of the code used other than "OpenSSL".  If you
+modify this file, you may extend this exception to your version of the
+file, but you are not obligated to do so.  If you do not wish to do
+so, delete this exception statement from your version.  */
 
 /* This file used to be kept in synch with the code in Fetchmail, but
    the latter has diverged since.  */
 
 /* This file used to be kept in synch with the code in Fetchmail, but
    the latter has diverged since.  */
@@ -26,12 +35,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
-#ifdef HAVE_STRING_H
-# include <string.h>
-#else
-# include <strings.h>
-#endif
-#include <sys/types.h>
+#include <string.h>
 #include <errno.h>
 
 #include "wget.h"
 #include <errno.h>
 
 #include "wget.h"
@@ -39,15 +43,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "netrc.h"
 #include "init.h"
 
 #include "netrc.h"
 #include "init.h"
 
-#ifndef errno
-extern int errno;
-#endif
-
 #define NETRC_FILE_NAME ".netrc"
 
 acc_t *netrc_list;
 
 #define NETRC_FILE_NAME ".netrc"
 
 acc_t *netrc_list;
 
-static acc_t *parse_netrc PARAMS ((const char *));
+static acc_t *parse_netrc (const char *);
 
 /* Return the correct user and password, given the host, user (as
    given in the URL), and password (as given in the URL).  May return
 
 /* Return the correct user and password, given the host, user (as
    given in the URL), and password (as given in the URL).  May return
@@ -74,7 +74,7 @@ search_netrc (const char *host, const char **acc, const char **passwd,
       if (home)
        {
          int err;
       if (home)
        {
          int err;
-         struct stat buf;
+         struct_stat buf;
          char *path = (char *)alloca (strlen (home) + 1
                                       + strlen (NETRC_FILE_NAME) + 1);
          sprintf (path, "%s/%s", home, NETRC_FILE_NAME);
          char *path = (char *)alloca (strlen (home) + 1
                                       + strlen (NETRC_FILE_NAME) + 1);
          sprintf (path, "%s/%s", home, NETRC_FILE_NAME);
@@ -90,8 +90,6 @@ search_netrc (const char *host, const char **acc, const char **passwd,
   /* Acc and password found; all OK.  */
   if (*acc && *passwd)
     return;
   /* Acc and password found; all OK.  */
   if (*acc && *passwd)
     return;
-  if (!*acc && !slack_default)
-    return;
   /* Some data not given -- try finding the host.  */
   for (l = netrc_list; l; l = l->next)
     {
   /* Some data not given -- try finding the host.  */
   for (l = netrc_list; l; l = l->next)
     {
@@ -165,7 +163,7 @@ read_whole_line (FILE *fp)
 {
   int length = 0;
   int bufsize = 81;
 {
   int length = 0;
   int bufsize = 81;
-  char *line = (char *)xmalloc (bufsize);
+  char *line = xmalloc (bufsize);
 
   while (fgets (line + length, bufsize - length, fp))
     {
 
   while (fgets (line + length, bufsize - length, fp))
     {
@@ -207,9 +205,9 @@ maybe_add_to_list (acc_t **newentry, acc_t **list)
   if (a && ! a->acc)
     {
       /* Free any allocated space.  */
   if (a && ! a->acc)
     {
       /* Free any allocated space.  */
-      xfree (a->host);
-      xfree (a->acc);
-      xfree (a->passwd);
+      xfree_null (a->host);
+      xfree_null (a->acc);
+      xfree_null (a->passwd);
     }
   else
     {
     }
   else
     {
@@ -221,7 +219,7 @@ maybe_add_to_list (acc_t **newentry, acc_t **list)
        }
 
       /* Allocate a new acc_t structure.  */
        }
 
       /* Allocate a new acc_t structure.  */
-      a = (acc_t *)xmalloc (sizeof (acc_t));
+      a = xmalloc (sizeof (acc_t));
     }
 
   /* Zero the structure, so that it is ready to use.  */
     }
 
   /* Zero the structure, so that it is ready to use.  */
@@ -237,7 +235,8 @@ maybe_add_to_list (acc_t **newentry, acc_t **list)
    null-terminated string once character to the left.
    Used in processing \ and " constructs in the netrc file */
 static void
    null-terminated string once character to the left.
    Used in processing \ and " constructs in the netrc file */
 static void
-shift_left(char *string){
+shift_left(char *string)
+{
   char *p;
   
   for (p=string; *p; ++p)
   char *p;
   
   for (p=string; *p; ++p)
@@ -249,7 +248,8 @@ static acc_t *
 parse_netrc (const char *path)
 {
   FILE *fp;
 parse_netrc (const char *path)
 {
   FILE *fp;
-  char *line, *p, *tok, *premature_token;
+  char *line, *p, *tok;
+  const char *premature_token;
   acc_t *current, *retval;
   int ln, quote;
 
   acc_t *current, *retval;
   int ln, quote;
 
@@ -274,7 +274,7 @@ parse_netrc (const char *path)
   premature_token = NULL;
 
   /* While there are lines in the file...  */
   premature_token = NULL;
 
   /* While there are lines in the file...  */
-  while ((line = read_whole_line (fp)))
+  while ((line = read_whole_line (fp)) != NULL)
     {
       ln ++;
 
     {
       ln ++;
 
@@ -282,6 +282,10 @@ parse_netrc (const char *path)
       p = line;
       quote = 0;
 
       p = line;
       quote = 0;
 
+      /* Skip leading whitespace.  */
+      while (*p && ISSPACE (*p))
+       p ++;
+
       /* If the line is empty, then end any macro definition.  */
       if (last_token == tok_macdef && !*p)
        /* End of macro if the line is empty.  */
       /* If the line is empty, then end any macro definition.  */
       if (last_token == tok_macdef && !*p)
        /* End of macro if the line is empty.  */
@@ -315,9 +319,13 @@ parse_netrc (const char *path)
            p ++;
          }
 
            p ++;
          }
 
-         /* if field was quoted, squash the trailing quotation mark */
+         /* If field was quoted, squash the trailing quotation mark
+            and reset quote flag.  */
          if (quote)
          if (quote)
-           shift_left(p);
+           {
+             shift_left (p);
+             quote = 0;
+           }
 
          /* Null-terminate the token, if it isn't already.  */
          if (*p)
 
          /* Null-terminate the token, if it isn't already.  */
          if (*p)
@@ -438,9 +446,9 @@ free_netrc(acc_t *l)
   while (l)
     {
       t = l->next;
   while (l)
     {
       t = l->next;
-      FREE_MAYBE (l->acc);
-      FREE_MAYBE (l->passwd);
-      FREE_MAYBE (l->host);
+      xfree_null (l->acc);
+      xfree_null (l->passwd);
+      xfree_null (l->host);
       xfree (l);
       l = t;
     }
       xfree (l);
       l = t;
     }
@@ -453,7 +461,7 @@ free_netrc(acc_t *l)
 int
 main (int argc, char **argv)
 {
 int
 main (int argc, char **argv)
 {
-  struct stat sb;
+  struct_stat sb;
   char *program_name, *file, *target;
   acc_t *head, *a;
 
   char *program_name, *file, *target;
   acc_t *head, *a;