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>
This commit is contained in:
Jason Riedy 2006-02-09 17:56:13 -08:00 committed by Junio C Hamano
parent ce1610ead6
commit 67d42212ff

View File

@ -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;