[PATCH] Use symbolic names for setup file access right

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Brilliantov Kirill Vladimirovich <brilliantov@xxxxxxxx>

Signed-off-by: Brilliantov Kirill Vladimirovich <brilliantov@xxxxxxxx>
---
 archive-tar.c        | 15 +++++++++------
 archive-zip.c        |  7 +++++--
 archive.c            |  3 ++-
 builtin/add.c        |  3 ++-
 builtin/am.c         |  8 +++++---
 builtin/apply.c      |  6 ++++--
 builtin/archive.c    |  4 +++-
 builtin/clone.c      |  7 ++++---
 builtin/config.c     |  4 +++-
 builtin/index-pack.c |  7 +++++--
 builtin/init-db.c    |  5 +++--
 builtin/log.c        |  4 +++-
 builtin/mailsplit.c  |  3 ++-
 builtin/merge.c      |  9 +++++----
 builtin/notes.c      |  4 +++-
 builtin/replace.c    |  3 ++-
 builtin/tag.c        |  3 ++-
 builtin/worktree.c   |  3 ++-
 cache.h              |  6 ++++--
 compat/mingw.c       |  4 ++--
 compat/stat.c        | 21 ++++++++++-----------
 config.c             |  9 +++++++--
 copy.c               |  4 +++-
 diff-no-index.c      |  3 ++-
 entry.c              | 12 +++++++-----
 fast-import.c        |  9 +++++----
 file-access.h        | 27 +++++++++++++++++++++++++++
 http.c               |  8 +++++---
 lockfile.c           |  3 ++-
 merge-recursive.c    |  7 ++++---
 notes-merge.c        |  3 ++-
 refs.c               |  7 ++++---
 rerere.c             |  3 ++-
 sequencer.c          |  5 +++--
 server-info.c        |  3 ++-
 setup.c              |  5 +++--
 sha1_file.c          | 13 +++++++------
 test-delta.c         |  3 ++-
 trace.c              |  4 +++-
 wrapper.c            |  3 ++-
 40 files changed, 172 insertions(+), 88 deletions(-)
 create mode 100644 file-access.h

diff --git a/archive-tar.c b/archive-tar.c
index 0d1e6bd..94caa30 100644
--- a/archive-tar.c
+++ b/archive-tar.c
@@ -6,6 +6,7 @@
 #include "archive.h"
 #include "streaming.h"
 #include "run-command.h"
+#include "file-access.h"
 
 #define RECORDSIZE	(512)
 #define BLOCKSIZE	(RECORDSIZE * 20)
@@ -167,7 +168,8 @@ static void prepare_header(struct archiver_args *args,
 			   struct ustar_header *header,
 			   unsigned int mode, unsigned long size)
 {
-	sprintf(header->mode, "%07o", mode & 07777);
+	sprintf(header->mode, "%07o",
+		mode & (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL));
 	sprintf(header->size, "%011lo", S_ISREG(mode) ? size : 0);
 	sprintf(header->mtime, "%011lo", (unsigned long) args->time);
 
@@ -192,7 +194,7 @@ static int write_extended_header(struct archiver_args *args,
 	unsigned int mode;
 	memset(&header, 0, sizeof(header));
 	*header.typeflag = TYPEFLAG_EXT_HEADER;
-	mode = 0100666;
+	mode = S_IFREG | FILE_RW_ALL;
 	sprintf(header.name, "%s.paxheader", sha1_to_hex(sha1));
 	prepare_header(args, &header, mode, size);
 	write_blocked(&header, sizeof(header));
@@ -216,13 +218,14 @@ static int write_tar_entry(struct archiver_args *args,
 
 	if (S_ISDIR(mode) || S_ISGITLINK(mode)) {
 		*header.typeflag = TYPEFLAG_DIR;
-		mode = (mode | 0777) & ~tar_umask;
+		mode = (mode | DIRECTORY_RW_ALL) & ~tar_umask;
 	} else if (S_ISLNK(mode)) {
 		*header.typeflag = TYPEFLAG_LNK;
-		mode |= 0777;
+		mode |= DIRECTORY_RW_ALL;
 	} else if (S_ISREG(mode)) {
 		*header.typeflag = TYPEFLAG_REG;
-		mode = (mode | ((mode & 0100) ? 0777 : 0666)) & ~tar_umask;
+		mode = (mode | ((mode & S_IXUSR)
+			? DIRECTORY_RW_ALL : FILE_RW_ALL)) & ~tar_umask;
 	} else {
 		return error("unsupported file mode: 0%o (SHA1: %s)",
 			     mode, sha1_to_hex(sha1));
@@ -300,7 +303,7 @@ static int write_global_extended_header(struct archiver_args *args)
 	strbuf_append_ext_header(&ext_header, "comment", sha1_to_hex(sha1), 40);
 	memset(&header, 0, sizeof(header));
 	*header.typeflag = TYPEFLAG_GLOBAL_HEADER;
-	mode = 0100666;
+	mode = S_IFREG | FILE_RW_ALL;
 	strcpy(header.name, "pax_global_header");
 	prepare_header(args, &header, mode, ext_header.len);
 	write_blocked(&header, sizeof(header));
diff --git a/archive-zip.c b/archive-zip.c
index ae3d67f..791c002 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -7,6 +7,7 @@
 #include "utf8.h"
 #include "userdiff.h"
 #include "xdiff-interface.h"
+#include "file-access.h"
 
 static int zip_date;
 static int zip_time;
@@ -249,8 +250,10 @@ static int write_zip_entry(struct archiver_args *args,
 		enum object_type type = sha1_object_info(sha1, &size);
 
 		method = 0;
-		attr2 = S_ISLNK(mode) ? ((mode | 0777) << 16) :
-			(mode & 0111) ? ((mode) << 16) : 0;
+		attr2 = S_ISLNK(mode)
+			? ((mode | DIRECTORY_RW_ALL) << 16)
+			: (mode & (S_IXUSR | S_IXGRP | S_IXOTH))
+				? ((mode) << 16) : 0;
 		if (S_ISREG(mode) && args->compression_level != 0 && size > 0)
 			method = 8;
 
diff --git a/archive.c b/archive.c
index 01b0899..f248b64 100644
--- a/archive.c
+++ b/archive.c
@@ -7,6 +7,7 @@
 #include "parse-options.h"
 #include "unpack-trees.h"
 #include "dir.h"
+#include "file-access.h"
 
 static char const * const archive_usage[] = {
 	N_("git archive [<options>] <tree-ish> [<path>...]"),
@@ -241,7 +242,7 @@ int write_archive_entries(struct archiver_args *args,
 		if (args->verbose)
 			fprintf(stderr, "%.*s\n", (int)len, args->base);
 		err = write_entry(args, args->tree->object.sha1, args->base,
-				  len, 040777);
+				  len, S_IFDIR | DIRECTORY_RW_ALL);
 		if (err)
 			return err;
 	}
diff --git a/builtin/add.c b/builtin/add.c
index b2a5c57..e76946b 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -17,6 +17,7 @@
 #include "revision.h"
 #include "bulk-checkin.h"
 #include "argv-array.h"
+#include "file-access.h"
 
 static const char * const builtin_add_usage[] = {
 	N_("git add [<options>] [--] <pathspec>..."),
@@ -200,7 +201,7 @@ static int edit_patch(int argc, const char **argv, const char *prefix)
 	rev.diffopt.output_format = DIFF_FORMAT_PATCH;
 	rev.diffopt.use_color = 0;
 	DIFF_OPT_SET(&rev.diffopt, IGNORE_DIRTY_SUBMODULES);
-	out = open(file, O_CREAT | O_WRONLY, 0666);
+	out = open(file, O_CREAT | O_WRONLY, FILE_RW_ALL);
 	if (out < 0)
 		die(_("Could not open '%s' for writing."), file);
 	rev.diffopt.file = xfdopen(out, "w");
diff --git a/builtin/am.c b/builtin/am.c
index 1399c8d..006f753 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -26,6 +26,7 @@
 #include "notes-utils.h"
 #include "rerere.h"
 #include "prompt.h"
+#include "file-access.h"
 
 /**
  * Returns 1 if the file is empty or does not exist, 0 otherwise.
@@ -391,7 +392,7 @@ static void write_commit_msg(const struct am_state *state)
 	int fd;
 	const char *filename = am_path(state, "final-commit");
 
-	fd = xopen(filename, O_WRONLY | O_CREAT, 0666);
+	fd = xopen(filename, O_WRONLY | O_CREAT, FILE_RW_ALL);
 	if (write_in_full(fd, state->msg, state->msg_len) < 0)
 		die_errno(_("could not write to %s"), filename);
 	close(fd);
@@ -983,7 +984,7 @@ static void am_setup(struct am_state *state, enum patch_format patch_format,
 		exit(128);
 	}
 
-	if (mkdir(state->dir, 0777) < 0 && errno != EEXIST)
+	if (mkdir(state->dir, DIRECTORY_RW_ALL) < 0 && errno != EEXIST)
 		die_errno(_("failed to create directory '%s'"), state->dir);
 
 	if (split_mail(state, patch_format, paths, keep_cr) < 0) {
@@ -1207,7 +1208,8 @@ static int parse_mail(struct am_state *state, const char *mail)
 
 	cp.git_cmd = 1;
 	cp.in = xopen(mail, O_RDONLY, 0);
-	cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT, 0777);
+	cp.out = xopen(am_path(state, "info"), O_WRONLY | O_CREAT,
+			DIRECTORY_RW_ALL);
 
 	argv_array_push(&cp.args, "mailinfo");
 	argv_array_push(&cp.args, state->utf8 ? "-u" : "-n");
diff --git a/builtin/apply.c b/builtin/apply.c
index 54aba4e..db8e572 100644
--- a/builtin/apply.c
+++ b/builtin/apply.c
@@ -20,6 +20,7 @@
 #include "xdiff-interface.h"
 #include "ll-merge.h"
 #include "rerere.h"
+#include "file-access.h"
 
 /*
  *  --check turns on checking that the working tree matches the
@@ -4102,7 +4103,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
 		struct stat st;
 		if (!lstat(path, &st) && S_ISDIR(st.st_mode))
 			return 0;
-		return mkdir(path, 0777);
+		return mkdir(path, DIRECTORY_RW_ALL);
 	}
 
 	if (has_symlinks && S_ISLNK(mode))
@@ -4111,7 +4112,8 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
 		 */
 		return symlink(buf, path);
 
-	fd = open(path, O_CREAT | O_EXCL | O_WRONLY, (mode & 0100) ? 0777 : 0666);
+	fd = open(path, O_CREAT | O_EXCL | O_WRONLY,
+			(mode & S_IXUSR) ? DIRECTORY_RW_ALL : FILE_RW_ALL);
 	if (fd < 0)
 		return -1;
 
diff --git a/builtin/archive.c b/builtin/archive.c
index a1e3b94..2f4109a 100644
--- a/builtin/archive.c
+++ b/builtin/archive.c
@@ -9,10 +9,12 @@
 #include "parse-options.h"
 #include "pkt-line.h"
 #include "sideband.h"
+#include "file-access.h"
 
 static void create_output_file(const char *output_file)
 {
-	int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC, 0666);
+	int output_fd = open(output_file, O_CREAT | O_WRONLY | O_TRUNC,
+				FILE_RW_ALL);
 	if (output_fd < 0)
 		die_errno(_("could not create archive file '%s'"), output_file);
 	if (output_fd != 1) {
diff --git a/builtin/clone.c b/builtin/clone.c
index 303a3a7..681fa71 100644
--- a/builtin/clone.c
+++ b/builtin/clone.c
@@ -24,6 +24,7 @@
 #include "remote.h"
 #include "run-command.h"
 #include "connected.h"
+#include "file-access.h"
 
 /*
  * Overall FIXMEs:
@@ -305,7 +306,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
 	if (!dir)
 		die_errno(_("failed to open '%s'"), src->buf);
 
-	if (mkdir(dest->buf, 0777)) {
+	if (mkdir(dest->buf, DIRECTORY_RW_ALL)) {
 		if (errno != EEXIST)
 			die_errno(_("failed to create directory '%s'"), dest->buf);
 		else if (stat(dest->buf, &buf))
@@ -350,7 +351,7 @@ static void copy_or_link_directory(struct strbuf *src, struct strbuf *dest,
 				die_errno(_("failed to create link '%s'"), dest->buf);
 			option_no_hardlinks = 1;
 		}
-		if (copy_file_with_time(dest->buf, src->buf, 0666))
+		if (copy_file_with_time(dest->buf, src->buf, FILE_RW_ALL))
 			die_errno(_("failed to copy file to '%s'"), dest->buf);
 	}
 	closedir(dir);
@@ -844,7 +845,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
 		if (safe_create_leading_directories_const(work_tree) < 0)
 			die_errno(_("could not create leading directories of '%s'"),
 				  work_tree);
-		if (!dest_exists && mkdir(work_tree, 0777))
+		if (!dest_exists && mkdir(work_tree, DIRECTORY_RW_ALL))
 			die_errno(_("could not create work tree dir '%s'"),
 				  work_tree);
 		junk_work_tree = work_tree;
diff --git a/builtin/config.c b/builtin/config.c
index 7188405..e918bdf 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -3,6 +3,7 @@
 #include "color.h"
 #include "parse-options.h"
 #include "urlmatch.h"
+#include "file-access.h"
 
 static const char *const builtin_config_usage[] = {
 	N_("git config [<options>]"),
@@ -576,7 +577,8 @@ int cmd_config(int argc, const char **argv, const char *prefix)
 		config_file = xstrdup(given_config_source.file ?
 				      given_config_source.file : git_path("config"));
 		if (use_global_config) {
-			int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY, 0666);
+			int fd = open(config_file, O_CREAT | O_EXCL | O_WRONLY,
+					FILE_RW_ALL);
 			if (fd) {
 				char *content = default_user_config();
 				write_str_in_full(fd, content);
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 3f10840..833b39d 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -11,6 +11,7 @@
 #include "exec_cmd.h"
 #include "streaming.h"
 #include "thread-utils.h"
+#include "file-access.h"
 
 static const char index_pack_usage[] =
 "git index-pack [-v] [-o <index-file>] [--keep | --keep=<msg>] [--verify] [--strict] (<pack-file> | --stdin [--fix-thin] [<pack-file>])";
@@ -308,7 +309,8 @@ static const char *open_pack_file(const char *pack_name)
 						"pack/tmp_pack_XXXXXX");
 			pack_name = xstrdup(tmp_file);
 		} else
-			output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
+			output_fd = open(pack_name, O_CREAT | O_EXCL | O_RDWR,
+					FILE_RW_USER);
 		if (output_fd < 0)
 			die_errno(_("unable to create '%s'"), pack_name);
 		nothread_data.pack_fd = output_fd;
@@ -1397,7 +1399,8 @@ static void final(const char *final_pack_name, const char *curr_pack_name,
 		if (!keep_name)
 			keep_fd = odb_pack_keep(name, sizeof(name), sha1);
 		else
-			keep_fd = open(keep_name, O_RDWR|O_CREAT|O_EXCL, 0600);
+			keep_fd = open(keep_name, O_RDWR | O_CREAT | O_EXCL,
+					FILE_RW_USER);
 
 		if (keep_fd < 0) {
 			if (errno != EEXIST)
diff --git a/builtin/init-db.c b/builtin/init-db.c
index 49df78d..e3e5c35 100644
--- a/builtin/init-db.c
+++ b/builtin/init-db.c
@@ -8,6 +8,7 @@
 #include "builtin.h"
 #include "exec_cmd.h"
 #include "parse-options.h"
+#include "file-access.h"
 
 #ifndef DEFAULT_GIT_TEMPLATE_DIR
 #define DEFAULT_GIT_TEMPLATE_DIR "/usr/share/git-core/templates"
@@ -26,7 +27,7 @@ static const char *git_link;
 
 static void safe_create_dir(const char *dir, int share)
 {
-	if (mkdir(dir, 0777) < 0) {
+	if (mkdir(dir, DIRECTORY_RW_ALL) < 0) {
 		if (errno != EEXIST) {
 			perror(dir);
 			exit(1);
@@ -542,7 +543,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
 					break;
 				}
 				shared_repository = saved;
-				if (mkdir(argv[0], 0777) < 0)
+				if (mkdir(argv[0], DIRECTORY_RW_ALL) < 0)
 					die_errno(_("cannot mkdir %s"), argv[0]);
 				mkdir_tried = 1;
 				goto retry;
diff --git a/builtin/log.c b/builtin/log.c
index b50ef75..832343d 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -26,6 +26,7 @@
 #include "version.h"
 #include "mailmap.h"
 #include "gpg-interface.h"
+#include "file-access.h"
 
 /* Set a default date-time format for git log ("log.date" config variable) */
 static const char *default_date_mode = NULL;
@@ -1387,7 +1388,8 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
 	if (output_directory) {
 		if (use_stdout)
 			die(_("standard output, or directory, which one?"));
-		if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
+		if (mkdir(output_directory, DIRECTORY_RW_ALL) < 0 &&
+			errno != EEXIST)
 			die_errno(_("Could not create directory '%s'"),
 				  output_directory);
 	}
diff --git a/builtin/mailsplit.c b/builtin/mailsplit.c
index 8e02ea1..3818860 100644
--- a/builtin/mailsplit.c
+++ b/builtin/mailsplit.c
@@ -8,6 +8,7 @@
 #include "builtin.h"
 #include "string-list.h"
 #include "strbuf.h"
+#include "file-access.h"
 
 static const char git_mailsplit_usage[] =
 "git mailsplit [-d<prec>] [-f<n>] [-b] [--keep-cr] -o<directory> [(<mbox>|<Maildir>)...]";
@@ -62,7 +63,7 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
 		fprintf(stderr, "corrupt mailbox\n");
 		exit(1);
 	}
-	fd = open(name, O_WRONLY | O_CREAT | O_EXCL, 0666);
+	fd = open(name, O_WRONLY | O_CREAT | O_EXCL, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno("cannot open output file '%s'", name);
 	output = xfdopen(fd, "w");
diff --git a/builtin/merge.c b/builtin/merge.c
index 85c54dc..1a3a28e 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -30,6 +30,7 @@
 #include "fmt-merge-msg.h"
 #include "gpg-interface.h"
 #include "sequencer.h"
+#include "file-access.h"
 
 #define DEFAULT_TWOHEAD (1<<0)
 #define DEFAULT_OCTOPUS (1<<1)
@@ -339,7 +340,7 @@ static void squash_message(struct commit *commit, struct commit_list *remotehead
 
 	printf(_("Squash commit -- not updating HEAD\n"));
 	filename = git_path("SQUASH_MSG");
-	fd = open(filename, O_WRONLY | O_CREAT, 0666);
+	fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno(_("Could not write to '%s'"), filename);
 
@@ -755,7 +756,7 @@ static void add_strategies(const char *string, unsigned attr)
 static void write_merge_msg(struct strbuf *msg)
 {
 	const char *filename = git_path("MERGE_MSG");
-	int fd = open(filename, O_WRONLY | O_CREAT, 0666);
+	int fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno(_("Could not open '%s' for writing"),
 			  filename);
@@ -968,7 +969,7 @@ static void write_merge_state(struct commit_list *remoteheads)
 		strbuf_addf(&buf, "%s\n", sha1_to_hex(sha1));
 	}
 	filename = git_path("MERGE_HEAD");
-	fd = open(filename, O_WRONLY | O_CREAT, 0666);
+	fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno(_("Could not open '%s' for writing"), filename);
 	if (write_in_full(fd, buf.buf, buf.len) != buf.len)
@@ -978,7 +979,7 @@ static void write_merge_state(struct commit_list *remoteheads)
 	write_merge_msg(&merge_msg);
 
 	filename = git_path("MERGE_MODE");
-	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno(_("Could not open '%s' for writing"), filename);
 	strbuf_reset(&buf);
diff --git a/builtin/notes.c b/builtin/notes.c
index 63f95fc..3119336 100644
--- a/builtin/notes.c
+++ b/builtin/notes.c
@@ -19,6 +19,7 @@
 #include "string-list.h"
 #include "notes-merge.h"
 #include "notes-utils.h"
+#include "file-access.h"
 
 static const char * const git_notes_usage[] = {
 	N_("git notes [--ref <notes-ref>] [list [<object>]]"),
@@ -168,7 +169,8 @@ static void prepare_note_data(const unsigned char *object, struct note_data *d,
 
 		/* write the template message before editing: */
 		d->edit_path = git_pathdup("NOTES_EDITMSG");
-		fd = open(d->edit_path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
+		fd = open(d->edit_path, O_CREAT | O_TRUNC | O_WRONLY,
+				FILE_RW_USER);
 		if (fd < 0)
 			die_errno(_("could not create file '%s'"), d->edit_path);
 
diff --git a/builtin/replace.c b/builtin/replace.c
index 6b3c469..70fe7b9 100644
--- a/builtin/replace.c
+++ b/builtin/replace.c
@@ -14,6 +14,7 @@
 #include "parse-options.h"
 #include "run-command.h"
 #include "tag.h"
+#include "file-access.h"
 
 static const char * const git_replace_usage[] = {
 	N_("git replace [-f] <object> <replacement>"),
@@ -203,7 +204,7 @@ static void export_object(const unsigned char *sha1, enum object_type type,
 	struct child_process cmd = CHILD_PROCESS_INIT;
 	int fd;
 
-	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0666);
+	fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno("unable to open %s for writing", filename);
 
diff --git a/builtin/tag.c b/builtin/tag.c
index cccca99..c489ad1 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -17,6 +17,7 @@
 #include "gpg-interface.h"
 #include "sha1-array.h"
 #include "column.h"
+#include "file-access.h"
 
 static const char * const git_tag_usage[] = {
 	N_("git tag [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <tagname> [<head>]"),
@@ -472,7 +473,7 @@ static void create_tag(const unsigned char *object, const char *tag,
 
 		/* write the template message before editing: */
 		path = git_pathdup("TAG_EDITMSG");
-		fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0600);
+		fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, FILE_RW_USER);
 		if (fd < 0)
 			die_errno(_("could not create file '%s'"), path);
 
diff --git a/builtin/worktree.c b/builtin/worktree.c
index 430b51e..c53d837 100644
--- a/builtin/worktree.c
+++ b/builtin/worktree.c
@@ -8,6 +8,7 @@
 #include "run-command.h"
 #include "sigchain.h"
 #include "refs.h"
+#include "file-access.h"
 
 static const char * const worktree_usage[] = {
 	N_("git worktree add [<options>] <path> <branch>"),
@@ -228,7 +229,7 @@ static int add_worktree(const char *path, const char *refname,
 	atexit(remove_junk);
 	sigchain_push_common(remove_junk_on_signal);
 
-	if (mkdir(sb_repo.buf, 0777))
+	if (mkdir(sb_repo.buf, DIRECTORY_RW_ALL))
 		die_errno(_("could not create directory of '%s'"), sb_repo.buf);
 	junk_git_dir = xstrdup(sb_repo.buf);
 	is_junk = 1;
diff --git a/cache.h b/cache.h
index 6bb7119..99e88e1 100644
--- a/cache.h
+++ b/cache.h
@@ -9,6 +9,7 @@
 #include "convert.h"
 #include "trace.h"
 #include "string-list.h"
+#include "file-access.h"
 
 #include SHA1_HEADER
 #ifndef git_SHA_CTX
@@ -242,7 +243,8 @@ static inline unsigned create_ce_flags(unsigned stage)
 #define ce_skip_worktree(ce) ((ce)->ce_flags & CE_SKIP_WORKTREE)
 #define ce_mark_uptodate(ce) ((ce)->ce_flags |= CE_UPTODATE)
 
-#define ce_permissions(mode) (((mode) & 0100) ? 0755 : 0644)
+#define ce_permissions(mode) \
+	(((mode) & S_IXUSR) ? DIRECTORY_RW_USER_R_ALL : FILE_RW_USER_R_ALL)
 static inline unsigned int create_ce_mode(unsigned int mode)
 {
 	if (S_ISLNK(mode))
@@ -261,7 +263,7 @@ static inline unsigned int ce_mode_from_stat(const struct cache_entry *ce,
 	if (!trust_executable_bit && S_ISREG(mode)) {
 		if (ce && S_ISREG(ce->ce_mode))
 			return ce->ce_mode;
-		return create_ce_mode(0666);
+		return create_ce_mode(FILE_RW_ALL);
 	}
 	return create_ce_mode(mode);
 }
diff --git a/compat/mingw.c b/compat/mingw.c
index 496e6f8..55e2aef 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -208,7 +208,7 @@ int mingw_unlink(const char *pathname)
 		return -1;
 
 	/* read-only files cannot be removed */
-	_wchmod(wpathname, 0666);
+	_wchmod(wpathname, FILE_RW_ALL);
 	while ((ret = _wunlink(wpathname)) == -1 && tries < ARRAY_SIZE(delay)) {
 		if (!is_file_in_use_error(GetLastError()))
 			break;
@@ -650,7 +650,7 @@ int mkstemp(char *template)
 	char *filename = mktemp(template);
 	if (filename == NULL)
 		return -1;
-	return open(filename, O_RDWR | O_CREAT, 0600);
+	return open(filename, O_RDWR | O_CREAT, FILE_RW_USER);
 }
 
 int gettimeofday(struct timeval *tv, void *tz)
diff --git a/compat/stat.c b/compat/stat.c
index a2d3931..f040b25 100644
--- a/compat/stat.c
+++ b/compat/stat.c
@@ -1,24 +1,23 @@
-#define _POSIX_C_SOURCE 200112L
-#include <sys/stat.h>  /* *stat, S_IS* */
-#include <sys/types.h> /* mode_t       */
+#include "../file-access.h"
 
 static inline mode_t mode_native_to_git(mode_t native_mode)
 {
-	mode_t perm_bits = native_mode & 07777;
+	mode_t perm_bits =
+		native_mode & (S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL);
 	if (S_ISREG(native_mode))
-		return 0100000 | perm_bits;
+		return S_IFREG | perm_bits;
 	if (S_ISDIR(native_mode))
-		return 0040000 | perm_bits;
+		return S_IFDIR | perm_bits;
 	if (S_ISLNK(native_mode))
-		return 0120000 | perm_bits;
+		return S_IFLNK | perm_bits;
 	if (S_ISBLK(native_mode))
-		return 0060000 | perm_bits;
+		return S_IFBLK | perm_bits;
 	if (S_ISCHR(native_mode))
-		return 0020000 | perm_bits;
+		return S_IFCHR | perm_bits;
 	if (S_ISFIFO(native_mode))
-		return 0010000 | perm_bits;
+		return S_IFIFO | perm_bits;
 	if (S_ISSOCK(native_mode))
-		return 0140000 | perm_bits;
+		return S_IFSOCK | perm_bits;
 	/* Non-standard type bits were given. */
 	return perm_bits;
 }
diff --git a/config.c b/config.c
index 9fd275f..1f01eb5 100644
--- a/config.c
+++ b/config.c
@@ -13,6 +13,7 @@
 #include "hashmap.h"
 #include "string-list.h"
 #include "utf8.h"
+#include "file-access.h"
 
 struct config_source {
 	struct config_source *prev;
@@ -2066,7 +2067,9 @@ int git_config_set_multivar_in_file(const char *config_filename,
 		}
 		close(in_fd);
 
-		if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) {
+		if (chmod(lock->filename.buf,
+			st.st_mode &
+			(S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL)) < 0) {
 			error("chmod on %s failed: %s",
 				lock->filename.buf, strerror(errno));
 			ret = CONFIG_NO_WRITE;
@@ -2252,7 +2255,9 @@ int git_config_rename_section_in_file(const char *config_filename,
 
 	fstat(fileno(config_file), &st);
 
-	if (chmod(lock->filename.buf, st.st_mode & 07777) < 0) {
+	if (chmod(lock->filename.buf,
+		st.st_mode &
+		(S_ISUID | S_ISGID | S_ISVTX | DIRECTORY_RW_ALL)) < 0) {
 		ret = error("chmod on %s failed: %s",
 				lock->filename.buf, strerror(errno));
 		goto out;
diff --git a/copy.c b/copy.c
index 574fa1f..c2116b9 100644
--- a/copy.c
+++ b/copy.c
@@ -1,4 +1,5 @@
 #include "cache.h"
+#include "file-access.h"
 
 int copy_fd(int ifd, int ofd)
 {
@@ -32,7 +33,8 @@ int copy_file(const char *dst, const char *src, int mode)
 {
 	int fdi, fdo, status;
 
-	mode = (mode & 0111) ? 0777 : 0666;
+	mode = (mode & (S_IXUSR | S_IXGRP | S_IXOTH))
+		? DIRECTORY_RW_ALL : FILE_RW_ALL;
 	if ((fdi = open(src, O_RDONLY)) < 0)
 		return fdi;
 	if ((fdo = open(dst, O_WRONLY | O_CREAT | O_EXCL, mode)) < 0) {
diff --git a/diff-no-index.c b/diff-no-index.c
index 0320605..0f30018 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -16,6 +16,7 @@
 #include "builtin.h"
 #include "string-list.h"
 #include "dir.h"
+#include "file-access.h"
 
 static int read_directory_contents(const char *path, struct string_list *list)
 {
@@ -51,7 +52,7 @@ static int get_mode(const char *path, int *mode)
 		*mode = 0;
 #endif
 	else if (path == file_from_standard_input)
-		*mode = create_ce_mode(0666);
+		*mode = create_ce_mode(FILE_RW_ALL);
 	else if (lstat(path, &st))
 		return error("Could not access '%s'", path);
 	else
diff --git a/entry.c b/entry.c
index 1eda8e9..f8359f1 100644
--- a/entry.c
+++ b/entry.c
@@ -2,6 +2,7 @@
 #include "blob.h"
 #include "dir.h"
 #include "streaming.h"
+#include "file-access.h"
 
 static void create_directories(const char *path, int path_len,
 			       const struct checkout *state)
@@ -34,9 +35,10 @@ static void create_directories(const char *path, int path_len,
 		 * there, therefore we then try to unlink it and try
 		 * one more time to create the directory.
 		 */
-		if (mkdir(buf, 0777)) {
+		if (mkdir(buf, DIRECTORY_RW_ALL)) {
 			if (errno == EEXIST && state->force &&
-			    !unlink_or_warn(buf) && !mkdir(buf, 0777))
+			    !unlink_or_warn(buf) &&
+			    !mkdir(buf, DIRECTORY_RW_ALL))
 				continue;
 			die_errno("cannot create directory at '%s'", buf);
 		}
@@ -75,7 +77,7 @@ static void remove_subtree(struct strbuf *path)
 
 static int create_file(const char *path, unsigned int mode)
 {
-	mode = (mode & 0100) ? 0777 : 0666;
+	mode = (mode & S_IXUSR) ? DIRECTORY_RW_ALL : FILE_RW_ALL;
 	return open(path, O_WRONLY | O_CREAT | O_EXCL, mode);
 }
 
@@ -100,7 +102,7 @@ static int open_output_fd(char *path, const struct cache_entry *ce, int to_tempf
 		       ? ".merge_link_XXXXXX" : ".merge_file_XXXXXX");
 		return mkstemp(path);
 	} else {
-		return create_file(path, !symlink ? ce->ce_mode : 0666);
+		return create_file(path, !symlink ? ce->ce_mode : FILE_RW_ALL);
 	}
 }
 
@@ -201,7 +203,7 @@ static int write_entry(struct cache_entry *ce,
 	case S_IFGITLINK:
 		if (to_tempfile)
 			return error("cannot create temporary submodule %s", path);
-		if (mkdir(path, 0777) < 0)
+		if (mkdir(path, DIRECTORY_RW_ALL) < 0)
 			return error("cannot create submodule directory %s", path);
 		break;
 	default:
diff --git a/fast-import.c b/fast-import.c
index 2ad4fee..b082b46 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -166,6 +166,7 @@ Format of STDIN stream:
 #include "quote.h"
 #include "exec_cmd.h"
 #include "dir.h"
+#include "file-access.h"
 
 #define PACK_ID_BITS 16
 #define MAX_PACK_ID ((1<<PACK_ID_BITS)-1)
@@ -2303,11 +2304,11 @@ static void file_change_m(const char *p, struct branch *b)
 	if (!p)
 		die("Corrupt mode: %s", command_buf.buf);
 	switch (mode) {
-	case 0644:
-	case 0755:
+	case FILE_RW_USER_R_ALL:
+	case DIRECTORY_RW_USER_R_ALL:
 		mode |= S_IFREG;
-	case S_IFREG | 0644:
-	case S_IFREG | 0755:
+	case S_IFREG | FILE_RW_USER_R_ALL:
+	case S_IFREG | DIRECTORY_RW_USER_R_ALL:
 	case S_IFLNK:
 	case S_IFDIR:
 	case S_IFGITLINK:
diff --git a/file-access.h b/file-access.h
new file mode 100644
index 0000000..ef5585e
--- /dev/null
+++ b/file-access.h
@@ -0,0 +1,27 @@
+#ifndef FILE_ACCESS_H
+#define FILE_ACCESS_H
+
+#include <sys/stat.h>
+
+/* rwxr-xr-x (0755) */
+#define DIRECTORY_RW_USER_R_ALL \
+	(S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)
+
+/* rwxrwxrwx (0777) */
+#define DIRECTORY_RW_ALL (S_IRWXU | S_IRWXG | S_IRWXO)
+
+/* rw------- (0600) */
+#define FILE_RW_USER (S_IRUSR | S_IWUSR)
+
+/* rw-r--r-- (0644) */
+#define FILE_RW_USER_R_ALL (FILE_RW_USER | S_IRGRP | S_IROTH)
+
+/* r--r--r-- (0444) */
+#define FILE_R_ALL (S_IRUSR | S_IRGRP | S_IROTH)
+
+/* rw-rw-rw- (0666) */
+#define FILE_RW_ALL (FILE_RW_USER | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)
+
+#endif /* FILE_ACCESS_H */
+
+/* vim: set ts=8 sw=8 noet */
diff --git a/http.c b/http.c
index e9c6fdd..ef0dc2b 100644
--- a/http.c
+++ b/http.c
@@ -9,6 +9,7 @@
 #include "version.h"
 #include "pkt-line.h"
 #include "gettext.h"
+#include "file-access.h"
 
 int active_requests;
 int http_is_verbose;
@@ -1643,7 +1644,7 @@ struct http_object_request *new_http_object_request(const char *base_url,
 	if (freq->localfile != -1)
 		error("fd leakage in start: %d", freq->localfile);
 	freq->localfile = open(freq->tmpfile,
-			       O_WRONLY | O_CREAT | O_EXCL, 0666);
+			       O_WRONLY | O_CREAT | O_EXCL, FILE_RW_ALL);
 	/*
 	 * This could have failed due to the "lazy directory creation";
 	 * try to mkdir the last path component.
@@ -1652,11 +1653,12 @@ struct http_object_request *new_http_object_request(const char *base_url,
 		char *dir = strrchr(freq->tmpfile, '/');
 		if (dir) {
 			*dir = 0;
-			mkdir(freq->tmpfile, 0777);
+			mkdir(freq->tmpfile, DIRECTORY_RW_ALL);
 			*dir = '/';
 		}
 		freq->localfile = open(freq->tmpfile,
-				       O_WRONLY | O_CREAT | O_EXCL, 0666);
+					O_WRONLY | O_CREAT | O_EXCL,
+					FILE_RW_ALL);
 	}
 
 	if (freq->localfile < 0) {
diff --git a/lockfile.c b/lockfile.c
index 993bb82..5abd046 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -4,6 +4,7 @@
 #include "cache.h"
 #include "lockfile.h"
 #include "sigchain.h"
+#include "file-access.h"
 
 static struct lock_file *volatile lock_file_list;
 
@@ -140,7 +141,7 @@ static int lock_file(struct lock_file *lk, const char *path, int flags)
 	}
 
 	strbuf_addstr(&lk->filename, LOCK_SUFFIX);
-	lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, 0666);
+	lk->fd = open(lk->filename.buf, O_RDWR | O_CREAT | O_EXCL, FILE_RW_ALL);
 	if (lk->fd < 0) {
 		strbuf_reset(&lk->filename);
 		return -1;
diff --git a/merge-recursive.c b/merge-recursive.c
index 44d85be..60e355e 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -22,6 +22,7 @@
 #include "merge-recursive.h"
 #include "dir.h"
 #include "submodule.h"
+#include "file-access.h"
 
 static struct tree *shift_tree_object(struct tree *one, struct tree *two,
 				      const char *subtree_shift)
@@ -779,10 +780,10 @@ static void update_file_flags(struct merge_options *o,
 		}
 		if (S_ISREG(mode) || (!has_symlinks && S_ISLNK(mode))) {
 			int fd;
-			if (mode & 0100)
-				mode = 0777;
+			if (mode & S_IXUSR)
+				mode = DIRECTORY_RW_ALL;
 			else
-				mode = 0666;
+				mode = FILE_RW_ALL;
 			fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode);
 			if (fd < 0)
 				die_errno(_("failed to open '%s'"), path);
diff --git a/notes-merge.c b/notes-merge.c
index 0b2b82c..014d14c 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -10,6 +10,7 @@
 #include "notes-merge.h"
 #include "strbuf.h"
 #include "notes-utils.h"
+#include "file-access.h"
 
 struct notes_merge_pair {
 	unsigned char obj[20], base[20], local[20], remote[20];
@@ -301,7 +302,7 @@ static void write_buf_to_worktree(const unsigned char *obj,
 	if (file_exists(path))
 		die("found existing file at '%s'", path);
 
-	fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666);
+	fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno("failed to open '%s'", path);
 
diff --git a/refs.c b/refs.c
index 2db2975..294d521 100644
--- a/refs.c
+++ b/refs.c
@@ -5,6 +5,7 @@
 #include "tag.h"
 #include "dir.h"
 #include "string-list.h"
+#include "file-access.h"
 
 struct ref_lock {
 	char *ref_name;
@@ -3163,7 +3164,7 @@ static int log_ref_setup(const char *refname, struct strbuf *sb_logfile, struct
 		oflags |= O_CREAT;
 	}
 
-	logfd = open(logfile, oflags, 0666);
+	logfd = open(logfile, oflags, FILE_RW_ALL);
 	if (logfd < 0) {
 		if (!(oflags & O_CREAT) && (errno == ENOENT || errno == EISDIR))
 			return 0;
@@ -3174,7 +3175,7 @@ static int log_ref_setup(const char *refname, struct strbuf *sb_logfile, struct
 					    "'%s'", logfile);
 				return -1;
 			}
-			logfd = open(logfile, oflags, 0666);
+			logfd = open(logfile, oflags, FILE_RW_ALL);
 		}
 
 		if (logfd < 0) {
@@ -3406,7 +3407,7 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
 		goto error_free_return;
 	}
 	lockpath = mkpath("%s.lock", git_HEAD);
-	fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
+	fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, FILE_RW_ALL);
 	if (fd < 0) {
 		error("Unable to open %s for writing", lockpath);
 		goto error_free_return;
diff --git a/rerere.c b/rerere.c
index 94aea9a..af225c0 100644
--- a/rerere.c
+++ b/rerere.c
@@ -8,6 +8,7 @@
 #include "ll-merge.h"
 #include "attr.h"
 #include "pathspec.h"
+#include "file-access.h"
 
 #define RESOLVED 0
 #define PUNTED 1
@@ -559,7 +560,7 @@ static int do_plain_rerere(struct string_list *rr, int fd)
 			continue;
 
 		fprintf(stderr, "Recorded resolution for '%s'.\n", path);
-		copy_file(rerere_path(name, "postimage"), path, 0666);
+		copy_file(rerere_path(name, "postimage"), path, FILE_RW_ALL);
 	mark_resolved:
 		rr->items[i].util = NULL;
 	}
diff --git a/sequencer.c b/sequencer.c
index c4f4b7d..375c032 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -15,6 +15,7 @@
 #include "merge-recursive.h"
 #include "refs.h"
 #include "argv-array.h"
+#include "file-access.h"
 
 #define GIT_REFLOG_ACTION "GIT_REFLOG_ACTION"
 
@@ -167,7 +168,7 @@ static void write_cherry_pick_head(struct commit *commit, const char *pseudoref)
 	strbuf_addf(&buf, "%s\n", sha1_to_hex(commit->object.sha1));
 
 	filename = git_path("%s", pseudoref);
-	fd = open(filename, O_WRONLY | O_CREAT, 0666);
+	fd = open(filename, O_WRONLY | O_CREAT, FILE_RW_ALL);
 	if (fd < 0)
 		die_errno(_("Could not open '%s' for writing"), filename);
 	if (write_in_full(fd, buf.buf, buf.len) != buf.len || close(fd))
@@ -843,7 +844,7 @@ static int create_seq_dir(void)
 		advise(_("try \"git cherry-pick (--continue | --quit | --abort)\""));
 		return -1;
 	}
-	else if (mkdir(seq_dir, 0777) < 0)
+	else if (mkdir(seq_dir, DIRECTORY_RW_ALL) < 0)
 		die_errno(_("Could not create sequencer directory %s"), seq_dir);
 	return 0;
 }
diff --git a/server-info.c b/server-info.c
index c82e9ee..86d13bf 100644
--- a/server-info.c
+++ b/server-info.c
@@ -3,6 +3,7 @@
 #include "object.h"
 #include "commit.h"
 #include "tag.h"
+#include "file-access.h"
 
 /*
  * Create the file "path" by writing to a temporary file and renaming
@@ -17,7 +18,7 @@ static int update_info_file(char *path, int (*generate)(FILE *))
 	FILE *fp = NULL;
 
 	safe_create_leading_directories(path);
-	fd = git_mkstemp_mode(tmp, 0666);
+	fd = git_mkstemp_mode(tmp, FILE_RW_ALL);
 	if (fd < 0)
 		goto out;
 	fp = fdopen(fd, "w");
diff --git a/setup.c b/setup.c
index 5f9f07d..ac1c6ea 100644
--- a/setup.c
+++ b/setup.c
@@ -1,6 +1,7 @@
 #include "cache.h"
 #include "dir.h"
 #include "string-list.h"
+#include "file-access.h"
 
 static int inside_git_dir = -1;
 static int inside_work_tree = -1;
@@ -915,7 +916,7 @@ int git_config_perm(const char *var, const char *value)
 
 	/* A filemode value was given: 0xxx */
 
-	if ((i & 0600) != 0600)
+	if ((i & FILE_RW_USER) != FILE_RW_USER)
 		die("Problem with core.sharedRepository filemode value "
 		    "(0%.3o).\nThe owner of files must always have "
 		    "read and write permissions.", i);
@@ -924,7 +925,7 @@ int git_config_perm(const char *var, const char *value)
 	 * Mask filemode value. Others can not get write permission.
 	 * x flags for directories are handled separately.
 	 */
-	return -(i & 0666);
+	return -(i & FILE_RW_ALL);
 }
 
 int check_repository_format_version(const char *var, const char *value, void *cb)
diff --git a/sha1_file.c b/sha1_file.c
index 1cee438..db4052d 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -23,6 +23,7 @@
 #include "bulk-checkin.h"
 #include "streaming.h"
 #include "dir.h"
+#include "file-access.h"
 
 #ifndef O_NOATIME
 #if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
@@ -82,7 +83,7 @@ static struct cached_object *find_cached_object(const unsigned char *sha1)
 
 int mkdir_in_gitdir(const char *path)
 {
-	if (mkdir(path, 0777)) {
+	if (mkdir(path, DIRECTORY_RW_ALL)) {
 		int saved_errno = errno;
 		struct stat st;
 		struct strbuf sb = STRBUF_INIT;
@@ -99,7 +100,7 @@ int mkdir_in_gitdir(const char *path)
 		if (lstat(path, &st) || !S_ISLNK(st.st_mode) ||
 		    strbuf_readlink(&sb, path, st.st_size) ||
 		    !is_absolute_path(sb.buf) ||
-		    mkdir(sb.buf, 0777)) {
+		    mkdir(sb.buf, DIRECTORY_RW_ALL)) {
 			strbuf_release(&sb);
 			errno = saved_errno;
 			return -1;
@@ -136,7 +137,7 @@ enum scld_error safe_create_leading_directories(char *path)
 			/* path exists */
 			if (!S_ISDIR(st.st_mode))
 				ret = SCLD_EXISTS;
-		} else if (mkdir(path, 0777)) {
+		} else if (mkdir(path, DIRECTORY_RW_ALL)) {
 			if (errno == EEXIST &&
 			    !stat(path, &st) && S_ISDIR(st.st_mode))
 				; /* somebody created it since we checked */
@@ -3003,19 +3004,19 @@ static int create_tmpfile(char *buffer, size_t bufsiz, const char *filename)
 	}
 	memcpy(buffer, filename, dirlen);
 	strcpy(buffer + dirlen, "tmp_obj_XXXXXX");
-	fd = git_mkstemp_mode(buffer, 0444);
+	fd = git_mkstemp_mode(buffer, FILE_R_ALL);
 	if (fd < 0 && dirlen && errno == ENOENT) {
 		/* Make sure the directory exists */
 		memcpy(buffer, filename, dirlen);
 		buffer[dirlen-1] = 0;
-		if (mkdir(buffer, 0777) && errno != EEXIST)
+		if (mkdir(buffer, DIRECTORY_RW_ALL) && errno != EEXIST)
 			return -1;
 		if (adjust_shared_perm(buffer))
 			return -1;
 
 		/* Try again */
 		strcpy(buffer + dirlen - 1, "/tmp_obj_XXXXXX");
-		fd = git_mkstemp_mode(buffer, 0444);
+		fd = git_mkstemp_mode(buffer, FILE_R_ALL);
 	}
 	return fd;
 }
diff --git a/test-delta.c b/test-delta.c
index 4595cd6..faf1d67 100644
--- a/test-delta.c
+++ b/test-delta.c
@@ -11,6 +11,7 @@
 #include "git-compat-util.h"
 #include "delta.h"
 #include "cache.h"
+#include "file-access.h"
 
 static const char usage_str[] =
 	"test-delta (-d|-p) <from_file> <data_file> <out_file>";
@@ -68,7 +69,7 @@ int main(int argc, char *argv[])
 		return 1;
 	}
 
-	fd = open (argv[4], O_WRONLY|O_CREAT|O_TRUNC, 0666);
+	fd = open (argv[4], O_WRONLY | O_CREAT | O_TRUNC, FILE_RW_ALL);
 	if (fd < 0 || write_in_full(fd, out_buf, out_size) != out_size) {
 		perror(argv[4]);
 		return 1;
diff --git a/trace.c b/trace.c
index 7393926..da312a5 100644
--- a/trace.c
+++ b/trace.c
@@ -24,6 +24,7 @@
 
 #include "cache.h"
 #include "quote.h"
+#include "file-access.h"
 
 /* Get a trace file descriptor from "key" env variable. */
 static int get_trace_fd(struct trace_key *key)
@@ -49,7 +50,8 @@ static int get_trace_fd(struct trace_key *key)
 	else if (strlen(trace) == 1 && isdigit(*trace))
 		key->fd = atoi(trace);
 	else if (is_absolute_path(trace)) {
-		int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT, 0666);
+		int fd = open(trace, O_WRONLY | O_APPEND | O_CREAT,
+				FILE_RW_ALL);
 		if (fd == -1) {
 			fprintf(stderr,
 				"Could not open '%s' for tracing: %s\n"
diff --git a/wrapper.c b/wrapper.c
index e451463..33c394b 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -2,6 +2,7 @@
  * Various trivial helper wrappers around standard functions
  */
 #include "cache.h"
+#include "file-access.h"
 
 static void do_nothing(size_t size)
 {
@@ -625,7 +626,7 @@ int write_file(const char *path, int fatal, const char *fmt, ...)
 {
 	struct strbuf sb = STRBUF_INIT;
 	va_list params;
-	int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0666);
+	int fd = open(path, O_RDWR | O_CREAT | O_TRUNC, FILE_RW_ALL);
 	if (fd < 0) {
 		if (fatal)
 			die_errno(_("could not open %s for writing"), path);
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]