X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fnetrc.c;h=1e12d1deddba24c73086e2abd841a598b1200037;hp=e6c0d12c0363cb86d924862224b5c50f7d67e195;hb=38a7829dcb4eb5dba28dbf0f05c6a80fea9217f8;hpb=714ccdcd844314cc3902fa4fd1b48757d9db9296 diff --git a/src/netrc.c b/src/netrc.c index e6c0d12c..1e12d1de 100644 --- a/src/netrc.c +++ b/src/netrc.c @@ -1,5 +1,6 @@ /* Read and parse the .netrc file to get hosts, accounts, and passwords. - Copyright (C) 1996, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1996, 2007, 2008, 2009, 2010, 2011 Free Software + Foundation, Inc. This file is part of GNU Wget. @@ -43,10 +44,16 @@ as that of the covered work. */ #define NETRC_FILE_NAME ".netrc" -acc_t *netrc_list; +static acc_t *netrc_list; static acc_t *parse_netrc (const char *); +void +netrc_cleanup(void) +{ + free_netrc (netrc_list); +} + /* Return the correct user and password, given the host, user (as given in the URL), and password (as given in the URL). May return NULL. @@ -163,48 +170,6 @@ search_netrc (const char *host, const char **acc, const char **passwd, # define xrealloc realloc -/* Read a line from FP. The function reallocs the storage as needed - to accomodate for any length of the line. Reallocs are done - storage exponentially, doubling the storage after each overflow to - minimize the number of calls to realloc() and fgets(). The newline - character at the end of line is retained. - - After end-of-file is encountered without anything being read, NULL - is returned. NULL is also returned on error. To distinguish - between these two cases, use the stdio function ferror(). */ - -char * -read_whole_line (FILE *fp) -{ - int length = 0; - int bufsize = 81; - char *line = xmalloc (bufsize); - - while (fgets (line + length, bufsize - length, fp)) - { - length += strlen (line + length); - assert (length > 0); - if (line[length - 1] == '\n') - break; - /* fgets() guarantees to read the whole line, or to use up the - space we've given it. We can double the buffer - unconditionally. */ - bufsize <<= 1; - line = xrealloc (line, bufsize); - } - if (length == 0 || ferror (fp)) - { - xfree (line); - return NULL; - } - if (length + 1 < bufsize) - /* Relieve the memory from our exponential greediness. We say - `length + 1' because the terminating \0 is not included in - LENGTH. We don't need to zero-terminate the string ourselves, - though, because fgets() does that. */ - line = xrealloc (line, length + 1); - return line; -} #endif /* STANDALONE */ /* Maybe add NEWENTRY to the account information list, LIST. NEWENTRY is @@ -253,7 +218,7 @@ static void shift_left(char *string) { char *p; - + for (p=string; *p; ++p) *p = *(p+1); } @@ -263,10 +228,11 @@ static acc_t * parse_netrc (const char *path) { FILE *fp; - char *line, *p, *tok; + char *line = NULL, *p, *tok; const char *premature_token; acc_t *current, *retval; - int ln, quote; + int ln, qmark; + size_t bufsize = 0; /* The latest token we've seen in the file. */ enum @@ -289,13 +255,13 @@ parse_netrc (const char *path) premature_token = NULL; /* While there are lines in the file... */ - while ((line = read_whole_line (fp)) != NULL) + while (getline (&line, &bufsize, fp) > 0) { ln ++; /* Parse the line. */ p = line; - quote = 0; + qmark = 0; /* Skip leading whitespace. */ while (*p && c_isspace (*p)) @@ -321,25 +287,25 @@ parse_netrc (const char *path) /* If the token starts with quotation mark, note this fact, and squash the quotation character */ if (*p == '"'){ - quote = 1; + qmark = 1; shift_left (p); } tok = p; /* Find the end of the token, handling quotes and escapes. */ - while (*p && (quote ? *p != '"' : !c_isspace (*p))){ + while (*p && (qmark ? *p != '"' : !c_isspace (*p))){ if (*p == '\\') shift_left (p); p ++; } /* If field was quoted, squash the trailing quotation mark - and reset quote flag. */ - if (quote) + and reset qmark flag. */ + if (qmark) { shift_left (p); - quote = 0; + qmark = 0; } /* Null-terminate the token, if it isn't already. */ @@ -388,8 +354,8 @@ parse_netrc (const char *path) if (premature_token) { fprintf (stderr, _("\ -%s: %s:%d: warning: \"%s\" token appears before any machine name\n"), - exec_name, path, ln, premature_token); +%s: %s:%d: warning: %s token appears before any machine name\n"), + exec_name, path, ln, quote (premature_token)); premature_token = NULL; } @@ -422,10 +388,9 @@ parse_netrc (const char *path) exec_name, path, ln, tok); } } - - xfree (line); } + xfree (line); fclose (fp); /* Finalize the last machine entry we found. */