From 3a429d3b8d03c98fbc775eb34a54b7b2bd74e02b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Sat, 30 Mar 2013 10:53:32 +0100 Subject: [PATCH 1/2] path.c: simplify adjust_shared_perm() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All calls to set_shared_perm() use mode == 0, so simplify the function. Because all callers use the macro adjust_shared_perm(path) from cache.h to call this function, convert it to a proper function, losing set_shared_perm(). Since path.c has much more functions than just mkpath() these days, drop the stale comment about it. Signed-off-by: Torsten Bögershausen Signed-off-by: Junio C Hamano --- cache.h | 3 +-- path.c | 27 +++++++-------------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/cache.h b/cache.h index c56315ccc3..9f3b649663 100644 --- a/cache.h +++ b/cache.h @@ -713,8 +713,7 @@ enum sharedrepo { PERM_EVERYBODY = 0664 }; int git_config_perm(const char *var, const char *value); -int set_shared_perm(const char *path, int mode); -#define adjust_shared_perm(path) set_shared_perm((path), 0) +int adjust_shared_perm(const char *path); int safe_create_leading_directories(char *path); int safe_create_leading_directories_const(const char *path); int mkdir_in_gitdir(const char *path); diff --git a/path.c b/path.c index 2fdccc2f18..e27959a12b 100644 --- a/path.c +++ b/path.c @@ -1,14 +1,5 @@ /* - * I'm tired of doing "vsnprintf()" etc just to open a - * file, so here's a "return static buffer with printf" - * interface for paths. - * - * It's obviously not thread-safe. Sue me. But it's quite - * useful for doing things like - * - * f = open(mkpath("%s/%s.git", base, name), O_RDONLY); - * - * which is what it's designed for. + * Utilities for paths and pathnames */ #include "cache.h" #include "strbuf.h" @@ -405,21 +396,17 @@ const char *enter_repo(const char *path, int strict) return NULL; } -int set_shared_perm(const char *path, int mode) +int adjust_shared_perm(const char *path) { - int tweak, shared, orig_mode; + int tweak, shared, orig_mode, mode; if (!shared_repository) { - if (mode) - return chmod(path, mode & ~S_IFMT); return 0; } - if (!mode) { - if (get_st_mode_bits(path, &mode) < 0) - return -1; - orig_mode = mode; - } else - orig_mode = 0; + if (get_st_mode_bits(path, &mode) < 0) + return -1; + + orig_mode = mode; if (shared_repository < 0) shared = -shared_repository; else From cbe43b847379e8d3db6aab2913b29b730fa5ca45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torsten=20B=C3=B6gershausen?= Date: Sat, 30 Mar 2013 10:53:47 +0100 Subject: [PATCH 2/2] path.c: optimize adjust_shared_perm() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sometimes the chown() function is called even when not needed (This can be provoked by running t1301, and adding some debug code). Save a chmod from 400 to 400, or from 600 to 600 on these files: .git/info/refs+ .git/objects/info/packs+ Save chmod on directories from 2770 to 2770: .git/refs .git/refs/heads .git/refs/tags Signed-off-by: Torsten Bögershausen Signed-off-by: Junio C Hamano --- path.c | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/path.c b/path.c index e27959a12b..04ff1487ed 100644 --- a/path.c +++ b/path.c @@ -396,22 +396,14 @@ const char *enter_repo(const char *path, int strict) return NULL; } -int adjust_shared_perm(const char *path) +static int calc_shared_perm(int mode) { - int tweak, shared, orig_mode, mode; + int tweak; - if (!shared_repository) { - return 0; - } - if (get_st_mode_bits(path, &mode) < 0) - return -1; - - orig_mode = mode; if (shared_repository < 0) - shared = -shared_repository; + tweak = -shared_repository; else - shared = shared_repository; - tweak = shared; + tweak = shared_repository; if (!(mode & S_IWUSR)) tweak &= ~0222; @@ -423,16 +415,28 @@ int adjust_shared_perm(const char *path) else mode |= tweak; - if (S_ISDIR(mode)) { + return mode; +} + + +int adjust_shared_perm(const char *path) +{ + int old_mode, new_mode; + + if (!shared_repository) + return 0; + if (get_st_mode_bits(path, &old_mode) < 0) + return -1; + + new_mode = calc_shared_perm(old_mode); + if (S_ISDIR(old_mode)) { /* Copy read bits to execute bits */ - mode |= (shared & 0444) >> 2; - mode |= FORCE_DIR_SET_GID; + new_mode |= (new_mode & 0444) >> 2; + new_mode |= FORCE_DIR_SET_GID; } - if (((shared_repository < 0 - ? (orig_mode & (FORCE_DIR_SET_GID | 0777)) - : (orig_mode & mode)) != mode) && - chmod(path, (mode & ~S_IFMT)) < 0) + if (((old_mode ^ new_mode) & ~S_IFMT) && + chmod(path, (new_mode & ~S_IFMT)) < 0) return -2; return 0; }