Update hold_lock_file_for_append and copy_fd to return a meaningful errno
on failure.

Signed-off-by: Ronnie Sahlberg <sahlb...@google.com>
---
 copy.c     | 20 +++++++++++++-------
 lockfile.c |  7 ++++++-
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/copy.c b/copy.c
index a7f58fd..5cb8679 100644
--- a/copy.c
+++ b/copy.c
@@ -9,10 +9,12 @@ int copy_fd(int ifd, int ofd)
                if (!len)
                        break;
                if (len < 0) {
-                       int read_error = errno;
+                       int save_errno = errno;
                        close(ifd);
-                       return error("copy-fd: read returned %s",
-                                    strerror(read_error));
+                       error("copy-fd: read returned %s",
+                             strerror(save_errno));
+                       errno = save_errno;
+                       return -1;
                }
                while (len) {
                        int written = xwrite(ofd, buf, len);
@@ -22,12 +24,16 @@ int copy_fd(int ifd, int ofd)
                        }
                        else if (!written) {
                                close(ifd);
-                               return error("copy-fd: write returned 0");
+                               error("copy-fd: write returned 0");
+                               errno = EAGAIN;
+                               return -1;
                        } else {
-                               int write_error = errno;
+                               int save_errno = errno;
                                close(ifd);
-                               return error("copy-fd: write returned %s",
-                                            strerror(write_error));
+                               error("copy-fd: write returned %s",
+                                     strerror(save_errno));
+                               errno = save_errno;
+                               return -1;
                        }
                }
        }
diff --git a/lockfile.c b/lockfile.c
index a921d77..32f4681 100644
--- a/lockfile.c
+++ b/lockfile.c
@@ -217,15 +217,20 @@ int hold_lock_file_for_append(struct lock_file *lk, const 
char *path, int flags)
        orig_fd = open(path, O_RDONLY);
        if (orig_fd < 0) {
                if (errno != ENOENT) {
+                       int save_errno = errno;
                        if (flags & LOCK_DIE_ON_ERROR)
                                die("cannot open '%s' for copying", path);
                        close(fd);
-                       return error("cannot open '%s' for copying", path);
+                       error("cannot open '%s' for copying", path);
+                       errno = save_errno;
+                       return -1;
                }
        } else if (copy_fd(orig_fd, fd)) {
+               int save_errno = errno;
                if (flags & LOCK_DIE_ON_ERROR)
                        exit(128);
                close(fd);
+               errno = save_errno;
                return -1;
        }
        return fd;
-- 
2.0.0.467.g08c0633

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to