Index: common.c =================================================================== --- common.c (revision 307768) +++ common.c (working copy) @@ -56,6 +56,7 @@ #include "fetch.h" #include "common.h" +int fetchNetrc = -2; /*** Local data **************************************************************/ @@ -1270,16 +1271,11 @@ return (word); } -/* - * Get authentication data for a URL from .netrc - */ int -fetch_netrc_auth(struct url *url) +fetchNetrcOpen(void) { char fn[PATH_MAX]; - const char *word; - char *p; - FILE *f; + const char *p; if ((p = getenv("NETRC")) != NULL) { if (snprintf(fn, sizeof(fn), "%s", p) >= (int)sizeof(fn)) { @@ -1299,8 +1295,32 @@ return (-1); } - if ((f = fopen(fn, "r")) == NULL) + fetchNetrc = open(fn, O_RDONLY); + return (fetchNetrc); +} + +/* + * Get authentication data for a URL from .netrc + */ +int +fetch_netrc_auth(struct url *url) +{ + const char *word; + FILE *f; + int localnetrc = -1; + + if (fetchNetrc == -2) { + fetchNetrcOpen(); + localnetrc = fetchNetrc; + } + if (fetchNetrc == -1) return (-1); + if ((f = fdopen(fetchNetrc, "r")) == NULL) { + if (localnetrc != -1) + close(localnetrc); + return (-1); + } + rewind(f); while ((word = fetch_read_word(f)) != NULL) { if (strcmp(word, "default") == 0) { DEBUG(fetch_info("Using default .netrc settings")); @@ -1340,10 +1360,16 @@ break; } } - fclose(f); + if (localnetrc != -1) + fclose(f); + else + fdclose(f, NULL); return (0); ferr: - fclose(f); + if (localnetrc != -1) + fclose(f); + else + fdclose(f, NULL); return (-1); } Index: fetch.h =================================================================== --- fetch.h (revision 307768) +++ fetch.h (working copy) @@ -123,6 +123,7 @@ FILE *fetchPut(struct url *, const char *); int fetchStat(struct url *, struct url_stat *, const char *); struct url_ent *fetchList(struct url *, const char *); +int fetchNetrcOpen(void); /* URL parsing */ struct url *fetchMakeURL(const char *, const char *, int, @@ -134,6 +135,7 @@ /* Authentication */ typedef int (*auth_t)(struct url *); +extern int fetchNetrc; extern auth_t fetchAuthMethod; /* Last error code */