reftable/stack: stop using `write_in_full()`

Similar to the preceding commit, drop our use of `write_in_full()` and implement a new wrapper `reftable_write_full()` that handles this logic for us. This is done to reduce our dependency on the Git library. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Feb 18, 2025 at 10:20 UTC e31db89558b7f1d622e5a64cf37779b721099814
1 file changed +24 -4
reftable/stack.c
+24 -4
@@ -48,6 +48,25 @@ static int stack_fsync(const struct reftable_write_options *opts, int fd)
48 return fsync(fd);
49 }
50
51 +static ssize_t reftable_write_data(int fd, const void *data, size_t size)
52 +{
53 + size_t total_written = 0;
54 + const char *p = data;
55 +
56 + while (total_written < size) {
57 + ssize_t bytes_written = write(fd, p, size - total_written);
58 + if (bytes_written < 0 && (errno == EAGAIN || errno == EINTR))
59 + continue;
60 + if (bytes_written < 0)
61 + return REFTABLE_IO_ERROR;
62 +
63 + total_written += bytes_written;
64 + p += bytes_written;
65 + }
66 +
67 + return total_written;
68 +}
69 +
70 struct fd_writer {
71 const struct reftable_write_options *opts;
72 int fd;
@@ -56,7 +75,7 @@ struct fd_writer {
75 static ssize_t fd_writer_write(void *arg, const void *data, size_t sz)
76 {
77 struct fd_writer *writer = arg;
59 - return write_in_full(writer->fd, data, sz);
78 + return reftable_write_data(writer->fd, data, sz);
79 }
80
81 static int fd_writer_flush(void *arg)
@@ -784,7 +803,8 @@ int reftable_addition_commit(struct reftable_addition *add)
803 goto done;
804 }
805
787 - err = write_in_full(add->tables_list_lock.fd, table_list.buf, table_list.len);
806 + err = reftable_write_data(add->tables_list_lock.fd,
807 + table_list.buf, table_list.len);
808 reftable_buf_release(&table_list);
809 if (err < 0) {
810 err = REFTABLE_IO_ERROR;
@@ -1470,8 +1490,8 @@ static int stack_compact_range(struct reftable_stack *st,
1490 goto done;
1491 }
1492
1473 - err = write_in_full(tables_list_lock.fd,
1474 - tables_list_buf.buf, tables_list_buf.len);
1493 + err = reftable_write_data(tables_list_lock.fd,
1494 + tables_list_buf.buf, tables_list_buf.len);
1495 if (err < 0) {
1496 err = REFTABLE_IO_ERROR;
1497 unlink(new_table_path.buf);