aboutsummaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorJason Riedy <ejr@EECS.Berkeley.EDU>2006-02-09 17:56:13 -0800
committerJunio C Hamano <junkio@cox.net>2006-02-09 18:38:52 -0800
commit67d42212ff104aaafa97b943cb369b8444f61581 (patch)
treebb274c269ed074409f0119690ddf788ee9a1b797 /sha1_file.c
parentce1610ead63221738225c415300f3d32620ced04 (diff)
downloadgit-67d42212ff104aaafa97b943cb369b8444f61581.tar.gz
git-67d42212ff104aaafa97b943cb369b8444f61581.tar.xz
stat() for existence in safe_create_leading_directories()
Use stat() to explicitly check for existence rather than relying on the non-portable EEXIST error in sha1_file.c's safe_create_leading_directories(). There certainly are optimizations possible, but then the code becomes almost the same as that in coreutil's lib/mkdir-p.c. Other uses of EEXIST seem ok. Tested on Solaris 8, AIX 5.2L, and a few Linux versions. AIX has some unrelated (I think) failures right now; I haven't tried many recent gits there. Anyone have an old Ultrix box to break everything? ;) Also remove extraneous #includes. Everything's already in git-compat-util.h, included through cache.h. Signed-off-by: Jason Riedy <ejr@cs.berkeley.edu> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 20f6419bd..3d11a9bfd 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -6,8 +6,6 @@
* This handles basic git sha1 object files - packing, unpacking,
* creation etc.
*/
-#include <sys/types.h>
-#include <dirent.h>
#include "cache.h"
#include "delta.h"
#include "pack.h"
@@ -74,6 +72,8 @@ int adjust_shared_perm(const char *path)
int safe_create_leading_directories(char *path)
{
char *pos = path;
+ struct stat st;
+
if (*pos == '/')
pos++;
@@ -82,12 +82,17 @@ int safe_create_leading_directories(char *path)
if (!pos)
break;
*pos = 0;
- if (mkdir(path, 0777) < 0) {
- if (errno != EEXIST) {
+ if (!stat(path, &st)) {
+ /* path exists */
+ if (!S_ISDIR(st.st_mode)) {
*pos = '/';
- return -1;
+ return -3;
}
}
+ else if (mkdir(path, 0777)) {
+ *pos = '/';
+ return -1;
+ }
else if (adjust_shared_perm(path)) {
*pos = '/';
return -2;