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:
parent
ce1610ead6
commit
67d42212ff
15
sha1_file.c
15
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;
|
||||
|
Loading…
Reference in New Issue
Block a user