mirror of
https://github.com/curl/curl.git
synced 2025-01-30 14:22:33 +08:00
tool_findfile: check ~/.config/curlrc too
... after the initial checks for .curlrc and if XDG_CONFIG_HOME is not set, use $HOME and $CURL_HOME to check if ~/.config/curlrc is present. Add test 436 to verify Reported-by: Sandro Jaeckel Fixes #8208 Closes #8213
This commit is contained in:
parent
4432234aca
commit
764e4f066d
@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2022, 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
|
||||
@ -42,18 +42,25 @@
|
||||
struct finder {
|
||||
const char *env;
|
||||
const char *append;
|
||||
bool withoutdot;
|
||||
};
|
||||
|
||||
/* The order of the variables below is important, as the index number is used
|
||||
in the findfile() function */
|
||||
static const struct finder list[] = {
|
||||
{ "CURL_HOME", NULL },
|
||||
{ "XDG_CONFIG_HOME", NULL },
|
||||
{ "HOME", NULL },
|
||||
{ "CURL_HOME", NULL, FALSE },
|
||||
{ "XDG_CONFIG_HOME", NULL, FALSE }, /* index == 1, used in the code */
|
||||
{ "HOME", NULL, FALSE },
|
||||
#ifdef WIN32
|
||||
{ "USERPROFILE", NULL },
|
||||
{ "APPDATA", NULL },
|
||||
{ "USERPROFILE", "\\Application Data"},
|
||||
{ "USERPROFILE", NULL, FALSE },
|
||||
{ "APPDATA", NULL, FALSE },
|
||||
{ "USERPROFILE", "\\Application Data", FALSE},
|
||||
#endif
|
||||
{ NULL, NULL }
|
||||
/* these are for .curlrc if XDG_CONFIG_HOME is not defined */
|
||||
{ "CURL_HOME", "/.config", TRUE },
|
||||
{ "HOME", "/.config", TRUE },
|
||||
|
||||
{ NULL, NULL, FALSE }
|
||||
};
|
||||
|
||||
static char *checkhome(const char *home, const char *fname, bool dotscore)
|
||||
@ -90,11 +97,12 @@ static char *checkhome(const char *home, const char *fname, bool dotscore)
|
||||
* the given file to be accessed there, then it is a match.
|
||||
* 2. Non-windows: try getpwuid
|
||||
*/
|
||||
char *findfile(const char *fname, bool dotscore)
|
||||
char *findfile(const char *fname, int dotscore)
|
||||
{
|
||||
int i;
|
||||
bool xdg = FALSE;
|
||||
DEBUGASSERT(fname && fname[0]);
|
||||
DEBUGASSERT(!dotscore || (fname[0] == '.'));
|
||||
DEBUGASSERT((dotscore != 1) || (fname[0] == '.'));
|
||||
|
||||
if(!fname[0])
|
||||
return NULL;
|
||||
@ -103,6 +111,9 @@ char *findfile(const char *fname, bool dotscore)
|
||||
char *home = curl_getenv(list[i].env);
|
||||
if(home) {
|
||||
char *path;
|
||||
const char *filename = fname;
|
||||
if(i == 1 /* XDG_CONFIG_HOME */)
|
||||
xdg = TRUE;
|
||||
if(!home[0]) {
|
||||
curl_free(home);
|
||||
continue;
|
||||
@ -114,7 +125,15 @@ char *findfile(const char *fname, bool dotscore)
|
||||
return NULL;
|
||||
home = c;
|
||||
}
|
||||
path = checkhome(home, fname, dotscore);
|
||||
if(list[i].withoutdot) {
|
||||
if(!dotscore || xdg)
|
||||
/* this is not looking for .curlrc, or the XDG_CONFIG_HOME was
|
||||
defined so we skip the extended check */
|
||||
continue;
|
||||
filename++; /* move past the leading dot */
|
||||
dotscore = 0; /* disable it for this check */
|
||||
}
|
||||
path = checkhome(home, filename, dotscore ? dotscore - 1 : 0);
|
||||
curl_free(home);
|
||||
if(path)
|
||||
return path;
|
||||
|
@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2022, 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,12 @@
|
||||
***************************************************************************/
|
||||
#include "tool_setup.h"
|
||||
|
||||
char *findfile(const char *fname, bool dotscore);
|
||||
#ifdef WIN32
|
||||
#define CURLRC_DOTSCORE 2 /* look for underscore-prefixed name too */
|
||||
#else
|
||||
#define CURLRC_DOTSCORE 1 /* regular .curlrc check */
|
||||
#endif
|
||||
|
||||
char *findfile(const char *fname, int dotscore);
|
||||
|
||||
#endif /* HEADER_CURL_TOOL_HOMEDIR_H */
|
||||
|
@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 1998 - 2022, 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
|
||||
@ -84,15 +84,10 @@ int parseconfig(const char *filename, struct GlobalConfig *global)
|
||||
int rc = 0;
|
||||
struct OperationConfig *operation = global->last;
|
||||
char *pathalloc = NULL;
|
||||
#ifdef WIN32
|
||||
#define DOTSCORE TRUE /* look for underscore-prefixed name too */
|
||||
#else
|
||||
#define DOTSCORE FALSE
|
||||
#endif
|
||||
|
||||
if(!filename) {
|
||||
/* NULL means load .curlrc from homedir! */
|
||||
char *curlrc = findfile(".curlrc", DOTSCORE);
|
||||
char *curlrc = findfile(".curlrc", CURLRC_DOTSCORE);
|
||||
if(curlrc) {
|
||||
file = fopen(curlrc, FOPEN_READTEXT);
|
||||
if(!file) {
|
||||
|
@ -68,7 +68,7 @@ test392 test393 test394 test395 test396 test397 \
|
||||
test400 test401 test402 test403 test404 test405 test406 test407 test408 \
|
||||
test409 test410 \
|
||||
\
|
||||
test430 test431 test432 test433 test434 test435 \
|
||||
test430 test431 test432 test433 test434 test435 test436 \
|
||||
\
|
||||
test490 test491 test492 test493 test494 \
|
||||
\
|
||||
|
58
tests/data/test436
Normal file
58
tests/data/test436
Normal file
@ -0,0 +1,58 @@
|
||||
<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/.config/curlrc">
|
||||
--next
|
||||
header = "a: a"
|
||||
data = "curlrc read"
|
||||
</file1>
|
||||
<server>
|
||||
http
|
||||
</server>
|
||||
<setenv>
|
||||
CURL_HOME=%PWD/log
|
||||
XDG_CONFIG_HOME=
|
||||
</setenv>
|
||||
<name>
|
||||
Find .curlrc in .config/curlrc via CURL_HOME
|
||||
</name>
|
||||
<command>
|
||||
%HOSTIP:%HTTPPORT/%TESTNUMBER
|
||||
</command>
|
||||
</client>
|
||||
|
||||
#
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<protocol nonewline="yes">
|
||||
POST /%TESTNUMBER HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
User-Agent: curl/%VERSION
|
||||
Accept: */*
|
||||
a: a
|
||||
Content-Length: 11
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
curlrc read
|
||||
</protocol>
|
||||
</verify>
|
||||
</testcase>
|
Loading…
Reference in New Issue
Block a user