[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[gnurl] 14/411: curl: support XDG_CONFIG_HOME to find .curlrc
From: |
gnunet |
Subject: |
[gnurl] 14/411: curl: support XDG_CONFIG_HOME to find .curlrc |
Date: |
Wed, 13 Jan 2021 01:17:09 +0100 |
This is an automated email from the git hooks/post-receive script.
nikita pushed a commit to branch master
in repository gnurl.
commit 4be1f8dc01013e4dee2b99026cd3b806ea7253c4
Author: Daniel Stenberg <daniel@haxx.se>
AuthorDate: Fri Aug 21 23:40:12 2020 +0200
curl: support XDG_CONFIG_HOME to find .curlrc
Added test433 to verify. Updated documentation.
Reviewed-by: Jay Satiro
Suggested-by: Eli Schwartz
Fixes #5829
Closes #5837
---
docs/cmdline-opts/config.d | 18 +++++++++-----
src/tool_homedir.c | 45 ++++++++++++++++++++++++++++++++++-
src/tool_homedir.h | 4 ++--
src/tool_operate.c | 2 +-
src/tool_parsecfg.c | 2 +-
tests/data/Makefile.inc | 2 +-
tests/data/test433 | 59 ++++++++++++++++++++++++++++++++++++++++++++++
7 files changed, 120 insertions(+), 12 deletions(-)
diff --git a/docs/cmdline-opts/config.d b/docs/cmdline-opts/config.d
index df3d39220..be46f7598 100644
--- a/docs/cmdline-opts/config.d
+++ b/docs/cmdline-opts/config.d
@@ -34,13 +34,19 @@ When curl is invoked, it (unless --disable is used) checks
for a default
config file and uses it if found. The default config file is checked for in
the following places in this order:
-1) curl tries to find the "home dir": It first checks for the CURL_HOME and
-then the HOME environment variables. Failing that, it uses getpwuid() on
-Unix-like systems (which returns the home dir given the current user in your
-system). On Windows, it then checks for the APPDATA variable, or as a last
-resort the '%USERPROFILE%\\Application Data'.
+1) Use the CURL_HOME environment variable if set
-2) On windows, if there is no .curlrc file in the home dir, it checks for one
+2) Use the XDG_CONFIG_HOME environment variable if set (Added in 7.73.0)
+
+3) Use the HOME environment variable if set
+
+4) Non-windows: use getpwuid to find the home directory
+
+5) Windows: use APPDATA if set
+
+6) Windows: use "USERPROFILE\Application Data" if set
+
+7) On windows, if there is no .curlrc file in the home dir, it checks for one
in the same dir the curl executable is placed. On Unix-like systems, it will
simply try to load .curlrc from the determined home dir.
diff --git a/src/tool_homedir.c b/src/tool_homedir.c
index 719ff6a55..3529672d6 100644
--- a/src/tool_homedir.c
+++ b/src/tool_homedir.c
@@ -25,6 +25,13 @@
# include <pwd.h>
#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
#include <curl/mprintf.h>
#include "tool_homedir.h"
@@ -45,7 +52,27 @@ static char *GetEnv(const char *variable)
}
/* return the home directory of the current user as an allocated string */
-char *homedir(void)
+
+/*
+ * The original logic found a home dir to use (by checking a range of
+ * environment variables and last using getpwuid) and returned that for the
+ * parent to use.
+ *
+ * With the XDG_CONFIG_HOME support (added much later than the other), this
+ * variable is treated differently in order to not ruin existing installations
+ * even if this environment variable is set. If this variable is set, and a
+ * file name is set to check, then only if that file name exists in that
+ * directory will it be returned as a "home directory".
+ *
+ * 1. use CURL_HOME if set
+ * 2. use XDG_CONFIG_HOME if set and fname is present
+ * 3. use HOME if set
+ * 4. Non-windows: use getpwuid
+ * 5. Windows: use APPDATA if set
+ * 6. Windows: use "USERPROFILE\Application Data" is set
+ */
+
+char *homedir(const char *fname)
{
char *home;
@@ -53,6 +80,22 @@ char *homedir(void)
if(home)
return home;
+ if(fname) {
+ home = GetEnv("XDG_CONFIG_HOME");
+ if(home) {
+ char *c = curl_maprintf("%s" DIR_CHAR "%s", home, fname);
+ if(c) {
+ int fd = open(c, O_RDONLY);
+ curl_free(c);
+ if(fd >= 0) {
+ close(fd);
+ return home;
+ }
+ }
+ free(home);
+ }
+ }
+
home = GetEnv("HOME");
if(home)
return home;
diff --git a/src/tool_homedir.h b/src/tool_homedir.h
index 1f9d54a63..66defc200 100644
--- a/src/tool_homedir.h
+++ b/src/tool_homedir.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -23,6 +23,6 @@
***************************************************************************/
#include "tool_setup.h"
-char *homedir(void);
+char *homedir(const char *fname);
#endif /* HEADER_CURL_TOOL_HOMEDIR_H */
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 3936315a9..1e4ed7df8 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -1696,7 +1696,7 @@ static CURLcode single_transfer(struct GlobalConfig
*global,
char *home;
char *file;
result = CURLE_FAILED_INIT;
- home = homedir();
+ home = homedir(NULL);
if(home) {
file = aprintf("%s/.ssh/known_hosts", home);
if(file) {
diff --git a/src/tool_parsecfg.c b/src/tool_parsecfg.c
index 5aeb2eebf..4e56492cb 100644
--- a/src/tool_parsecfg.c
+++ b/src/tool_parsecfg.c
@@ -82,7 +82,7 @@ int parseconfig(const char *filename, struct GlobalConfig
*global)
if(!filename || !*filename) {
/* NULL or no file name attempts to load .curlrc from the homedir! */
- char *home = homedir(); /* portable homedir finder */
+ char *home = homedir(".curlrc");
#ifndef WIN32
if(home) {
pathalloc = curl_maprintf("%s%s.curlrc", home, DIR_CHAR);
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index 9261ee221..29d913f62 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -66,7 +66,7 @@ test393 test394 test395 test396 test397 \
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
test409 \
\
-test430 test431 test432 \
+test430 test431 test432 test433 \
\
test490 test491 test492 \
\
diff --git a/tests/data/test433 b/tests/data/test433
new file mode 100644
index 000000000..90e54f05f
--- /dev/null
+++ b/tests/data/test433
@@ -0,0 +1,59 @@
+<testcase>
+<info>
+<keywords>
+--config
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data>
+HTTP/1.1 200 OK
+Content-Length: 6
+Content-Type: text/1
+
+-foo-
+</data>
+</reply>
+
+#
+# Client-side
+<client>
+<file1 name="log/.curlrc">
+--next
+header = "a: a"
+data = "curlrc read"
+</file1>
+<server>
+http
+</server>
+<setenv>
+XDG_CONFIG_HOME=%PWD/log
+</setenv>
+<name>
+Verify XDG_CONFIG_HOME use to find .curlrc
+</name>
+<command>
+%HOSTIP:%HTTPPORT/433
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol nonewline="yes">
+POST /433 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+a: a
+Content-Length: 11
+Content-Type: application/x-www-form-urlencoded
+
+curlrc read
+</protocol>
+</verify>
+</testcase>
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [gnurl] 05/411: runtests: clear pid variables when failing to start a server, (continued)
- [gnurl] 05/411: runtests: clear pid variables when failing to start a server, gnunet, 2021/01/12
- [gnurl] 02/411: RELEASE-NOTES: synced, gnunet, 2021/01/12
- [gnurl] 03/411: dist: add missing CMake Find modules to the distribution, gnunet, 2021/01/12
- [gnurl] 01/411: tls: provide the CApath verbose log on its own line, gnunet, 2021/01/12
- [gnurl] 07/411: Makefile.m32: add ability to override zstd libs [ci skip], gnunet, 2021/01/12
- [gnurl] 06/411: runtests: avoid 'fail to start' repeated messages in attempt loops, gnunet, 2021/01/12
- [gnurl] 08/411: KNOWN_BUGS: 'no_proxy' string-matches IPv6 numerical addreses, gnunet, 2021/01/12
- [gnurl] 33/411: curl_get_line: build only if cookies or alt-svc are enabled, gnunet, 2021/01/12
- [gnurl] 04/411: TODO: Virtual external sockets, gnunet, 2021/01/12
- [gnurl] 25/411: multi: expand pre-check for socket readiness, gnunet, 2021/01/12
- [gnurl] 14/411: curl: support XDG_CONFIG_HOME to find .curlrc,
gnunet <=
- [gnurl] 20/411: docs: --output-dir is added in 7.73.0, nothing else, gnunet, 2021/01/12
- [gnurl] 34/411: socketpair: allow CURL_DISABLE_SOCKETPAIR, gnunet, 2021/01/12
- [gnurl] 22/411: select: fix poll-based check not detecting connect failure, gnunet, 2021/01/12
- [gnurl] 21/411: select.h: make socket validation macros test for INVALID_SOCKET, gnunet, 2021/01/12
- [gnurl] 23/411: select: reduce duplication of Curl_poll in Curl_socket_check, gnunet, 2021/01/12
- [gnurl] 28/411: winbuild/README.md: make <options> visible, gnunet, 2021/01/12
- [gnurl] 31/411: git: ignore libtests in 3XXX area, gnunet, 2021/01/12
- [gnurl] 26/411: lib1560: verify "redirect" to double-slash leading URL, gnunet, 2021/01/12
- [gnurl] 17/411: sftp: add the option CURLKHSTAT_FINE_REPLACE, gnunet, 2021/01/12
- [gnurl] 19/411: curl: add --output-dir, gnunet, 2021/01/12