]> git.ipfire.org Git - thirdparty/git.git/commitdiff
reftable/stack: stop using `read_in_full()`
authorPatrick Steinhardt <ps@pks.im>
Tue, 18 Feb 2025 09:20:37 +0000 (10:20 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 18 Feb 2025 18:55:35 +0000 (10:55 -0800)
There is a single callsite of `read_in_full()` in the reftable library.
Open-code the function to reduce our dependency on the Git library.

Note that we only partially port over the logic from `read_in_full()`
and its underlying `xread()` helper. Most importantly, the latter also
knows to handle `EWOULDBLOCK` via `handle_nonblock()`. This logic is
irrelevant for us though because the reftable library never sets the
`O_NONBLOCK` option in the first place.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
reftable/stack.c

index 6c4e8be19b105008eabbaa14ad9385b765b03f15..1cc47b94d9c89e396c0c6ce66629e99ebf1fac4b 100644 (file)
@@ -115,13 +115,16 @@ out:
 
 static int fd_read_lines(int fd, char ***namesp)
 {
-       off_t size = lseek(fd, 0, SEEK_END);
        char *buf = NULL;
        int err = 0;
+       off_t size;
+
+       size = lseek(fd, 0, SEEK_END);
        if (size < 0) {
                err = REFTABLE_IO_ERROR;
                goto done;
        }
+
        err = lseek(fd, 0, SEEK_SET);
        if (err < 0) {
                err = REFTABLE_IO_ERROR;
@@ -134,9 +137,16 @@ static int fd_read_lines(int fd, char ***namesp)
                goto done;
        }
 
-       if (read_in_full(fd, buf, size) != size) {
-               err = REFTABLE_IO_ERROR;
-               goto done;
+       for (off_t total_read = 0; total_read < size; ) {
+               ssize_t bytes_read = read(fd, buf + total_read, size - total_read);
+               if (bytes_read < 0 && (errno == EAGAIN || errno == EINTR))
+                       continue;
+               if (bytes_read < 0 || !bytes_read) {
+                       err = REFTABLE_IO_ERROR;
+                       goto done;
+               }
+
+               total_read += bytes_read;
        }
        buf[size] = 0;