svn commit: r313974 - head/lib/libfetch

Baptiste Daroussin bapt at FreeBSD.org
Mon Feb 20 00:14:33 UTC 2017


Author: bapt
Date: Mon Feb 20 00:14:31 2017
New Revision: 313974
URL: https://svnweb.freebsd.org/changeset/base/313974

Log:
  Add a file descriptor in struct url for netrc
  
  When using libfetch in an application that drops privileges when fetching
  like pkg(8) then user complain because the application does not read anymore
  ${HOME}/.netrc. Now a caller can prepare a fd to the said file and manually
  assign it to the structure.
  
  It is also a first step to allow to capsicumize libfetch applications
  
  Reviewed by:	allanjude, des
  Approved by:	des
  Differential Revision:	https://reviews.freebsd.org/D9678

Modified:
  head/lib/libfetch/common.c
  head/lib/libfetch/fetch.c
  head/lib/libfetch/fetch.h

Modified: head/lib/libfetch/common.c
==============================================================================
--- head/lib/libfetch/common.c	Sun Feb 19 22:00:11 2017	(r313973)
+++ head/lib/libfetch/common.c	Mon Feb 20 00:14:31 2017	(r313974)
@@ -1339,16 +1339,11 @@ fetch_read_word(FILE *f)
 	return (word);
 }
 
-/*
- * Get authentication data for a URL from .netrc
- */
-int
-fetch_netrc_auth(struct url *url)
+static int
+fetch_netrc_open(void)
 {
+	const char *p;
 	char fn[PATH_MAX];
-	const char *word;
-	char *p;
-	FILE *f;
 
 	if ((p = getenv("NETRC")) != NULL) {
 		if (snprintf(fn, sizeof(fn), "%s", p) >= (int)sizeof(fn)) {
@@ -1368,8 +1363,25 @@ fetch_netrc_auth(struct url *url)
 			return (-1);
 	}
 
-	if ((f = fopen(fn, "r")) == NULL)
+	return (open(fn, O_RDONLY));
+}
+
+/*
+ * Get authentication data for a URL from .netrc
+ */
+int
+fetch_netrc_auth(struct url *url)
+{
+	const char *word;
+	FILE *f;
+
+	if (url->netrcfd == -2)
+		url->netrcfd = fetch_netrc_open();
+	if (url->netrcfd < 0)
+		return (-1);
+	if ((f = fdopen(url->netrcfd, "r")) == NULL)
 		return (-1);
+	rewind(f);
 	while ((word = fetch_read_word(f)) != NULL) {
 		if (strcmp(word, "default") == 0) {
 			DEBUG(fetch_info("Using default .netrc settings"));

Modified: head/lib/libfetch/fetch.c
==============================================================================
--- head/lib/libfetch/fetch.c	Sun Feb 19 22:00:11 2017	(r313973)
+++ head/lib/libfetch/fetch.c	Mon Feb 20 00:14:31 2017	(r313974)
@@ -284,6 +284,7 @@ fetchMakeURL(const char *scheme, const c
 	seturl(pwd);
 #undef seturl
 	u->port = port;
+	u->netrcfd = -2;
 
 	return (u);
 }

Modified: head/lib/libfetch/fetch.h
==============================================================================
--- head/lib/libfetch/fetch.h	Sun Feb 19 22:00:11 2017	(r313973)
+++ head/lib/libfetch/fetch.h	Mon Feb 20 00:14:31 2017	(r313974)
@@ -47,6 +47,7 @@ struct url {
 	off_t		 offset;
 	size_t		 length;
 	time_t		 ims_time;
+	int		 netrcfd;
 };
 
 struct url_stat {


More information about the svn-src-head mailing list