* [PATCH] stat() for existence in safe_create_leading_directories()
@ 2006-02-10 1:56 Jason Riedy
2006-02-10 2:30 ` Junio C Hamano
0 siblings, 1 reply; 2+ messages in thread
From: Jason Riedy @ 2006-02-10 1:56 UTC (permalink / raw)
To: git
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>
---
sha1_file.c | 15 ++++++++++-----
1 files changed, 10 insertions(+), 5 deletions(-)
597de7026f284d7bb5ea5b929a70b3cf3077e4e7
diff --git a/sha1_file.c b/sha1_file.c
index 20f6419..3d11a9b 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
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;
--
1.1.5
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH] stat() for existence in safe_create_leading_directories()
2006-02-10 1:56 [PATCH] stat() for existence in safe_create_leading_directories() Jason Riedy
@ 2006-02-10 2:30 ` Junio C Hamano
0 siblings, 0 replies; 2+ messages in thread
From: Junio C Hamano @ 2006-02-10 2:30 UTC (permalink / raw)
To: Jason Riedy; +Cc: git
Thanks.
BTW, in an earlier message when I said this:
Jason Riedy <ejr@EECS.Berkeley.EDU> writes:
> And Junio C Hamano writes:
>
> - Somehow I started to trust your ability to code portably a lot
> - better than I trust myself, [...]
>
> eep. ;) I only have access to three major variations at the
> moment (Linux, semi-old Solaris, recent AIX), so I'm not an
> authority... Solaris 8 is from before the general Linux/glibc
> compatability movement, so it's pretty useful for testing.
I was talking more about competence rather than access to
various environments to test on. I forgot to mention that.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2006-02-10 2:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-02-10 1:56 [PATCH] stat() for existence in safe_create_leading_directories() Jason Riedy
2006-02-10 2:30 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox