X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=netrc.c;h=5af542735349214d901c9f0f0f0ad5f366ede832;hb=87bcf29364c4640edb87cc2186b965d1a564d70c;hp=635228a7c44b988cf13a8b2d5d6fdf6ef01fe184;hpb=f7aef23b0c18a1ee4724f9e10984427cdee07c5d;p=~andy%2Ffetchmail diff --git a/netrc.c b/netrc.c index 635228a7..5af54273 100644 --- a/netrc.c +++ b/netrc.c @@ -1,31 +1,27 @@ -/* netrc.c -- parse the .netrc file to get hosts, accounts, and passwords - Copyright (C) 1996, Free Software Foundation, Inc. +/* + * netrc.c -- parse the .netrc file to get hosts, accounts, and passwords + * Gordon Matzigkeit , 1996 + Copyright assigned to Eric S. Raymond, October 2001. - This program 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 - (at your option) any later version. + For license terms, see the file COPYING in this directory. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + Compile with -DSTANDALONE to test this module. + (Makefile.am should have a rule so you can just type "make netrc") +*/ - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +#define _XOPEN_SOURCE 600 -/* Compile with -DSTANDALONE to test this module. */ +#include "config.h" #include #include #include #include -#include "config.h" #include "fetchmail.h" #include "netrc.h" +#include "gettext.h" #ifdef STANDALONE /* Normally defined in xstrdup.c. */ @@ -34,21 +30,21 @@ /* Normally defined in xmalloc.c */ # define xmalloc malloc # define xrealloc realloc + +const char *program_name = "netrc"; #endif /* Maybe add NEWENTRY to the account information list, LIST. NEWENTRY is set to a ready-to-use netrc_entry, in any event. */ static void -maybe_add_to_list (newentry, list) - netrc_entry **newentry; - netrc_entry **list; +maybe_add_to_list (netrc_entry **newentry, netrc_entry **list) { netrc_entry *a, *l; a = *newentry; l = *list; - /* We need an account name in order to add the entry to the list. */ - if (a && ! a->account) + /* We need a login name in order to add the entry to the list. */ + if (a && ! a->login) { /* Free any allocated space. */ if (a->host) @@ -83,11 +79,11 @@ maybe_add_to_list (newentry, list) list of entries. NULL is returned if the file could not be parsed. */ netrc_entry * -parse_netrc (file) - char *file; +parse_netrc (char *file) { FILE *fp; - char buf[POPBUFSIZE+1], *p, *tok, *premature_token; + char buf[POPBUFSIZE+1], *p, *tok; + const char *premature_token; netrc_entry *current, *retval; int ln; @@ -111,51 +107,81 @@ parse_netrc (file) premature_token = NULL; /* While there are lines in the file... */ - while (fgets(buf, POPBUFSIZE, fp)) + while (fgets(buf, sizeof(buf) - 1, fp)) { - ln ++; + ln++; /* Strip trailing CRLF */ - p = buf + strlen(buf) - 1; - while (*p && isspace(*p)) - *p-- = '\0'; + for (p = buf + strlen(buf) - 1; (p >= buf) && isspace((unsigned char)*p); p--) + *p = '\0'; /* Parse the line. */ p = buf; /* If the line is empty... */ if (!*p) + { if (last_token == tok_macdef) /* end of macro */ last_token = tok_nothing; else continue; /* otherwise ignore it */ + } /* If we are defining macros, then skip parsing the line. */ while (*p && last_token != tok_macdef) { + char quote_char = 0; + char *pp; + /* Skip any whitespace. */ - while (*p && isspace (*p)) + while (*p && isspace ((unsigned char)*p)) p++; /* Discard end-of-line comments. */ if (*p == '#') break; - tok = p; + tok = pp = p; /* Find the end of the token. */ - while (*p && !isspace (*p)) - p ++; - + while (*p && (quote_char || !isspace ((unsigned char)*p))) + { + if (quote_char) + { + if (quote_char == *p) + { + quote_char = 0; + p ++; + } + else + { + *pp = *p; + p ++; + pp ++; + } + } + else + { + if (*p == '"' || *p == '\'') + quote_char = *p; + else + { + *pp = *p; + pp ++; + } + p ++; + } + } /* Null-terminate the token, if it isn't already. */ if (*p) *p ++ = '\0'; + *pp = 0; switch (last_token) { case tok_login: if (current) - current->account = (char *) xstrdup (tok); + current->login = (char *) xstrdup (tok); else premature_token = "login"; break; @@ -192,15 +218,9 @@ parse_netrc (file) if (premature_token) { -#ifdef HAVE_ERROR - error_at_line (0, 0, file, ln, - _("warning: found \"%s\" before any host names"), - premature_token); -#else fprintf (stderr, - "%s:%d: warning: found \"%s\" before any host names\n", + GT_("%s:%d: warning: found \"%s\" before any host names\n"), file, ln, premature_token); -#endif premature_token = NULL; } @@ -210,9 +230,6 @@ parse_netrc (file) else { /* Fetch the next token. */ - if (!strcmp (tok, "account")) - last_token = tok_account; - if (!strcmp (tok, "default")) { maybe_add_to_list (¤t, &retval); @@ -232,9 +249,15 @@ parse_netrc (file) else if (!strcmp (tok, "password")) last_token = tok_password; + else if (!strcmp (tok, "passwd")) + last_token = tok_password; + + else if (!strcmp (tok, "account")) + last_token = tok_account; + else { - fprintf (stderr, "%s:%d: warning: unknown token \"%s\"\n", + fprintf (stderr, GT_("%s:%d: warning: unknown token \"%s\"\n"), file, ln, tok); } } @@ -270,20 +293,15 @@ parse_netrc (file) /* Return the netrc entry from LIST corresponding to HOST. NULL is returned if no such entry exists. */ netrc_entry * -search_netrc (list, host) - netrc_entry *list; - char *host; +search_netrc (netrc_entry *list, char *host, char *login) { /* Look for the HOST in LIST. */ while (list) { - if (!list->host) - /* We hit the default entry. */ - break; - - else if (!strcmp (list->host, host)) - /* We found a matching entry. */ - break; + if (list->host && !strcmp(list->host, host)) + if (!list->login || !strcmp(list->login, login)) + /* We found a matching entry. */ + break; list = list->next; } @@ -292,31 +310,46 @@ search_netrc (list, host) return list; } +void +free_netrc(netrc_entry *a) { + while(a) { + netrc_entry *n = a->next; + if (a->password != NULL) { + memset(a->password, 0x55, strlen(a->password)); + free(a->password); + } + xfree(a->login); + xfree(a->host); + xfree(a); + a = n; + } +} #ifdef STANDALONE #include #include -extern int errno; +#include -int -main (argc, argv) - int argc; - char **argv; +int main (int argc, char **argv) { struct stat sb; - char *program_name, *file, *target; + char *file, *host, *login; netrc_entry *head, *a; - if (argc < 2) - { - fprintf (stderr, "Usage: %s NETRC [HOSTNAME]...\n", argv[0]); - exit (1); - } - program_name = argv[0]; file = argv[1]; - target = argv[2]; + host = argv[2]; + login = argv[3]; + + switch (argc) { + case 2: + case 4: + break; + default: + fprintf (stderr, "Usage: %s [ ]\n", argv[0]); + exit(EXIT_FAILURE); + } if (stat (file, &sb)) { @@ -332,32 +365,25 @@ main (argc, argv) exit (1); } - if (argc > 2) + if (host && login) { - int i, status; - status = 0; - for (i = 2; i < argc; i++) - { - /* Print out the host that we are checking for. */ - fputs (argv[i], stdout); + int status; + status = EXIT_SUCCESS; - a = search_netrc (head, argv[i]); - if (a) + printf("Host: %s, Login: %s\n", host, login); + + a = search_netrc (head, host, login); + if (a) + { + /* Print out the password (if any). */ + if (a->password) { - /* Print out the account and password (if any). */ - fputc (' ', stdout); - fputs (a->account, stdout); - if (a->password) - { - fputc (' ', stdout); - fputs (a->password, stdout); - } + printf("Password: %s\n", a->password); } - else - status = 1; + } else + status = EXIT_FAILURE; + fputc ('\n', stdout); - fputc ('\n', stdout); - } exit (status); } @@ -373,8 +399,8 @@ main (argc, argv) fputc (' ', stdout); - /* Print the account name. */ - fputs (a->account, stdout); + /* Print the login name. */ + fputs (a->login, stdout); if (a->password) { @@ -387,6 +413,8 @@ main (argc, argv) a = a->next; } + free_netrc(head); + exit (0); } #endif /* STANDALONE */