mirror of
https://github.com/curl/curl.git
synced 2026-06-23 06:35:38 +03:00
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
This commit is contained in:
parent
98c94596f5
commit
4be1f8dc01
7 changed files with 120 additions and 12 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue