summaryrefslogtreecommitdiff
path: root/sha1_file.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@osdl.org>2005-10-26 10:27:36 -0700
committerJunio C Hamano <junkio@cox.net>2005-10-26 11:58:24 -0700
commit7ebb6fcafed2a3d47390e6f47ff20a98fe451409 (patch)
tree2ccc66e0795aad2eb16f95616f1704235f8c93ab /sha1_file.c
parentb5c367f75c2990650119749a1add5216871ca47a (diff)
downloadgit-7ebb6fcafed2a3d47390e6f47ff20a98fe451409.tar.gz
Fix what to do and how to detect when hardlinking fails
Recent FAT workaround caused compilation trouble on OpenBSD; different platforms use different error codes when we try to hardlink the temporary file to its final location. Existing Coda hack also checks its own error code, but the thing is, the case we care about is if link failed for a reason other than that the final file has already existed (which would be normal, or it could mean collision). So just check the error code against EEXIST. Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'sha1_file.c')
-rw-r--r--sha1_file.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/sha1_file.c b/sha1_file.c
index 7fdc46969d..642f00d3d4 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -1232,19 +1232,20 @@ static int link_temp_to_file(const char *tmpfile, char *filename)
int move_temp_to_file(const char *tmpfile, char *filename)
{
int ret = link_temp_to_file(tmpfile, filename);
- if (ret) {
- /*
- * Coda hack - coda doesn't like cross-directory links,
- * so we fall back to a rename, which will mean that it
- * won't be able to check collisions, but that's not a
- * big deal.
- *
- * The same holds for FAT formatted media.
- *
- * When this succeeds, we just return 0. We have nothing
- * left to unlink.
- */
- if ((ret == EXDEV || ret == ENOTSUP) && !rename(tmpfile, filename))
+
+ /*
+ * Coda hack - coda doesn't like cross-directory links,
+ * so we fall back to a rename, which will mean that it
+ * won't be able to check collisions, but that's not a
+ * big deal.
+ *
+ * The same holds for FAT formatted media.
+ *
+ * When this succeeds, we just return 0. We have nothing
+ * left to unlink.
+ */
+ if (ret && ret != EEXIST) {
+ if (!rename(tmpfile, filename))
return 0;
ret = errno;
}