svn commit: r334326 - head/lib/libfetch
Dag-Erling Smørgrav
des at FreeBSD.org
Tue May 29 13:07:38 UTC 2018
Author: des
Date: Tue May 29 13:07:36 2018
New Revision: 334326
URL: https://svnweb.freebsd.org/changeset/base/334326
Log:
Fix an inverted conditional in the netrc code, which would ignore the
value of $HOME and always use the home directory from the passwd
database, unless $HOME was unset, in which case it would use (null).
While there, clean up handling of netrcfd and add debugging aids.
MFC after: 3 weeks
Modified:
head/lib/libfetch/common.c
head/lib/libfetch/fetch.c
head/lib/libfetch/ftp.c
Modified: head/lib/libfetch/common.c
==============================================================================
--- head/lib/libfetch/common.c Tue May 29 12:43:03 2018 (r334325)
+++ head/lib/libfetch/common.c Tue May 29 13:07:36 2018 (r334326)
@@ -1361,19 +1361,20 @@ fetch_read_word(FILE *f)
static int
fetch_netrc_open(void)
{
- const char *p;
+ struct passwd *pwd;
char fn[PATH_MAX];
+ const char *p;
+ int fd, serrno;
if ((p = getenv("NETRC")) != NULL) {
+ DEBUGF("NETRC=%s\n", p);
if (snprintf(fn, sizeof(fn), "%s", p) >= (int)sizeof(fn)) {
fetch_info("$NETRC specifies a file name "
"longer than PATH_MAX");
return (-1);
}
} else {
- if ((p = getenv("HOME")) != NULL) {
- struct passwd *pwd;
-
+ if ((p = getenv("HOME")) == NULL) {
if ((pwd = getpwuid(getuid())) == NULL ||
(p = pwd->pw_dir) == NULL)
return (-1);
@@ -1382,7 +1383,12 @@ fetch_netrc_open(void)
return (-1);
}
- return (open(fn, O_RDONLY));
+ if ((fd = open(fn, O_RDONLY)) < 0) {
+ serrno = errno;
+ DEBUGF("%s: %s\n", fn, strerror(serrno));
+ errno = serrno;
+ }
+ return (fd);
}
/*
@@ -1392,24 +1398,32 @@ int
fetch_netrc_auth(struct url *url)
{
const char *word;
+ int serrno;
FILE *f;
- if (url->netrcfd == -2)
+ if (url->netrcfd < 0)
url->netrcfd = fetch_netrc_open();
if (url->netrcfd < 0)
return (-1);
- if ((f = fdopen(url->netrcfd, "r")) == NULL)
+ if ((f = fdopen(url->netrcfd, "r")) == NULL) {
+ serrno = errno;
+ DEBUGF("fdopen(netrcfd): %s", strerror(errno));
+ close(url->netrcfd);
+ url->netrcfd = -1;
+ errno = serrno;
return (-1);
+ }
rewind(f);
+ DEBUGF("searching netrc for %s\n", url->host);
while ((word = fetch_read_word(f)) != NULL) {
if (strcmp(word, "default") == 0) {
- DEBUGF("Using default .netrc settings");
+ DEBUGF("using default netrc settings\n");
break;
}
if (strcmp(word, "machine") == 0 &&
(word = fetch_read_word(f)) != NULL &&
strcasecmp(word, url->host) == 0) {
- DEBUGF("Using .netrc settings for %s", word);
+ DEBUGF("using netrc settings for %s\n", word);
break;
}
}
@@ -1441,9 +1455,13 @@ fetch_netrc_auth(struct url *url)
}
}
fclose(f);
+ url->netrcfd = -1;
return (0);
- ferr:
+ferr:
+ serrno = errno;
fclose(f);
+ url->netrcfd = -1;
+ errno = serrno;
return (-1);
}
Modified: head/lib/libfetch/fetch.c
==============================================================================
--- head/lib/libfetch/fetch.c Tue May 29 12:43:03 2018 (r334325)
+++ head/lib/libfetch/fetch.c Tue May 29 13:07:36 2018 (r334326)
@@ -272,6 +272,7 @@ fetchMakeURL(const char *scheme, const char *host, int
fetch_syserr();
return (NULL);
}
+ u->netrcfd = -1;
if ((u->doc = strdup(doc ? doc : "/")) == NULL) {
fetch_syserr();
@@ -286,7 +287,6 @@ fetchMakeURL(const char *scheme, const char *host, int
seturl(pwd);
#undef seturl
u->port = port;
- u->netrcfd = -2;
return (u);
}
@@ -352,7 +352,7 @@ fetchParseURL(const char *URL)
fetch_syserr();
return (NULL);
}
- u->netrcfd = -2;
+ u->netrcfd = -1;
/* scheme name */
if ((p = strstr(URL, ":/"))) {
Modified: head/lib/libfetch/ftp.c
==============================================================================
--- head/lib/libfetch/ftp.c Tue May 29 12:43:03 2018 (r334325)
+++ head/lib/libfetch/ftp.c Tue May 29 13:07:36 2018 (r334326)
@@ -914,7 +914,8 @@ ftp_authenticate(conn_t *conn, struct url *url, struct
fetch_netrc_auth(url);
user = url->user;
if (*user == '\0')
- user = getenv("FTP_LOGIN");
+ if ((user = getenv("FTP_LOGIN")) != NULL)
+ DEBUGF("FTP_LOGIN=%s\n", user);
if (user == NULL || *user == '\0')
user = FTP_ANONYMOUS_USER;
if (purl && url->port == fetch_default_port(url->scheme))
@@ -928,7 +929,8 @@ ftp_authenticate(conn_t *conn, struct url *url, struct
if (e == FTP_NEED_PASSWORD) {
pwd = url->pwd;
if (*pwd == '\0')
- pwd = getenv("FTP_PASSWORD");
+ if ((pwd = getenv("FTP_PASSWORD")) != NULL)
+ DEBUGF("FTP_PASSWORD=%s\n", pwd);
if (pwd == NULL || *pwd == '\0') {
if ((logname = getlogin()) == NULL)
logname = FTP_ANONYMOUS_USER;
More information about the svn-src-head
mailing list