From 3a1370ed06c8a7d2b513085a81e511917d98a6c6 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 21 Aug 2020 23:40:12 +0200 Subject: 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(-) create mode 100644 tests/data/test433 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 #endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_FCNTL_H +#include +#endif + #include #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, , et al. + * Copyright (C) 1998 - 2020, Daniel Stenberg, , 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 ad4e85dd8..320b852e0 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 3752502ef..01714238d 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 @@ + + + +--config + + + +# +# Server-side + + +HTTP/1.1 200 OK +Content-Length: 6 +Content-Type: text/1 + +-foo- + + + +# +# Client-side + + +--next +header = "a: a" +data = "curlrc read" + + +http + + +XDG_CONFIG_HOME=%PWD/log + + +Verify XDG_CONFIG_HOME use to find .curlrc + + +%HOSTIP:%HTTPPORT/433 + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +POST /433 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +a: a +Content-Length: 11 +Content-Type: application/x-www-form-urlencoded + +curlrc read + + + -- cgit v1.2.1