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 {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to