Skip to content

Commit

Permalink
config: warn on inaccessible files
Browse files Browse the repository at this point in the history
Before reading a config file, we check "!access(path, R_OK)"
to make sure that the file exists and is readable. If it's
not, then we silently ignore it.

For the case of ENOENT, this is fine, as the presence of the
file is optional. For other cases, though, it may indicate a
configuration error (e.g., not having permissions to read
the file). Let's print a warning in these cases to let the
user know.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Aug 21, 2012
1 parent 889d358 commit ba8bd83
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 7 deletions.
4 changes: 2 additions & 2 deletions builtin/config.c
Original file line number Diff line number Diff line change
Expand Up @@ -396,8 +396,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
*/
die("$HOME not set");

if (access(user_config, R_OK) &&
xdg_config && !access(xdg_config, R_OK))
if (access_or_warn(user_config, R_OK) &&
xdg_config && !access_or_warn(xdg_config, R_OK))
given_config_file = xdg_config;
else
given_config_file = user_config;
Expand Down
10 changes: 5 additions & 5 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ static int handle_path_include(const char *path, struct config_include_data *inc
path = buf.buf;
}

if (!access(path, R_OK)) {
if (!access_or_warn(path, R_OK)) {
if (++inc->depth > MAX_INCLUDE_DEPTH)
die(include_depth_advice, MAX_INCLUDE_DEPTH, path,
cf && cf->name ? cf->name : "the command line");
Expand Down Expand Up @@ -939,23 +939,23 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)

home_config_paths(&user_config, &xdg_config, "config");

if (git_config_system() && !access(git_etc_gitconfig(), R_OK)) {
if (git_config_system() && !access_or_warn(git_etc_gitconfig(), R_OK)) {
ret += git_config_from_file(fn, git_etc_gitconfig(),
data);
found += 1;
}

if (xdg_config && !access(xdg_config, R_OK)) {
if (xdg_config && !access_or_warn(xdg_config, R_OK)) {
ret += git_config_from_file(fn, xdg_config, data);
found += 1;
}

if (user_config && !access(user_config, R_OK)) {
if (user_config && !access_or_warn(user_config, R_OK)) {
ret += git_config_from_file(fn, user_config, data);
found += 1;
}

if (repo_config && !access(repo_config, R_OK)) {
if (repo_config && !access_or_warn(repo_config, R_OK)) {
ret += git_config_from_file(fn, repo_config, data);
found += 1;
}
Expand Down
3 changes: 3 additions & 0 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -604,6 +604,9 @@ int rmdir_or_warn(const char *path);
*/
int remove_or_warn(unsigned int mode, const char *path);

/* Call access(2), but warn for any error besides ENOENT. */
int access_or_warn(const char *path, int mode);

/* Get the passwd entry for the UID of the current process. */
struct passwd *xgetpwuid_self(void);

Expand Down
8 changes: 8 additions & 0 deletions wrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,14 @@ int remove_or_warn(unsigned int mode, const char *file)
return S_ISGITLINK(mode) ? rmdir_or_warn(file) : unlink_or_warn(file);
}

int access_or_warn(const char *path, int mode)
{
int ret = access(path, mode);
if (ret && errno != ENOENT)
warning(_("unable to access '%s': %s"), path, strerror(errno));
return ret;
}

struct passwd *xgetpwuid_self(void)
{
struct passwd *pw;
Expand Down

0 comments on commit ba8bd83

Please sign in to comment.